Add Reset_Demodata Cli function
[tine20] / tine20 / Addressbook / Setup / DemoData.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Addressbook
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Alexander Stintzing <a.stintzing@metaways.de>
8  * @copyright   Copyright (c) 2013 Metaways Infosystems GmbH (http://www.metaways.de)
9  *
10  */
11
12 /**
13  * class for Addressbook initialization
14  *
15  * @package     Setup
16  */
17 class Addressbook_Setup_DemoData extends Tinebase_Setup_DemoData_Abstract
18 {
19     /**
20      * holds the instance of the singleton
21      *
22      * @var Addressbook_Setup_DemoData
23      */
24     private static $_instance = NULL;
25     
26     /**
27      * the application name to work on
28      * 
29      * @var string
30      */
31     protected $_appName = 'Addressbook';
32     
33     /**
34      * the addresses got from csv
35      */
36     protected $_addresses = NULL;
37     
38     /**
39      * required apps
40      * 
41      * @var array
42      */
43     protected static $_requiredApplications = array('Admin');
44     
45     /**
46      * holds indexes of male images in $this->_images
47      * 
48      * @var array
49      */
50     protected $_photosMale = NULL;
51     
52     /**
53      * holds indexes of female images in $this->_images
54      * 
55      * @var array
56      */
57     protected $_photosFemale = NULL;
58     
59     /**
60      * the corresponding images to the contacts
61      */
62     protected $_images = NULL;
63     
64     protected $_createdContactIndex = 0;
65     
66     /**
67      * the controller
68      * 
69      * @var Addressbook_Controller_Contact
70      */
71     protected $_controller;
72     
73     /**
74      * models to work on
75      * @var array
76      */
77     protected $_models = array('contact');
78     
79     /**
80      * the constructor
81      */
82     private function __construct()
83     {
84         $this->_controller = Addressbook_Controller_Contact::getInstance();
85         $this->_controller->sendNotifications(FALSE);
86         $this->_controller->setGeoDataForContacts(FALSE);
87     }
88
89     /**
90      * the singleton pattern
91      *
92      * @return Addressbook_Setup_DemoData
93      */
94     public static function getInstance()
95     {
96         if (self::$_instance === NULL) {
97             self::$_instance = new self();
98         }
99
100         return self::$_instance;
101     }
102     
103     /**
104      * this is required for other applications needing demo data of this application
105      * if this returns true, this demodata has been run already
106      * 
107      * @return boolean
108      */
109     public static function hasBeenRun()
110     {
111         $c = Addressbook_Controller_Contact::getInstance();
112         
113         $f = new Addressbook_Model_ContactFilter(array(
114             array('field' => 'url', 'operator' => 'contains', 'value' => 'brillenstobercstober.com'),
115         ), 'AND');
116         
117         return ($c->search($f)->count() > 50) ? true : false;
118     }
119     
120     /**
121      * @see Tinebase_Setup_DemoData_Abstract
122      * 
123      * get csv-record-data and image-data
124      * attention: image-line[n] = csv-line[n-1]
125      */
126     protected function _onCreate()
127     {
128         $csvFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'DemoData' . DIRECTORY_SEPARATOR . 'out1000.csv';
129         $imageFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'DemoData' . DIRECTORY_SEPARATOR . 'base64images.txt';
130         if (! (file_exists($csvFile) && file_exists($imageFile))) {
131             die('File does not exist!');
132         }
133         $fhcsv = fopen($csvFile, 'r');
134         $fhimages = fopen($imageFile, 'r');
135         $i=0;
136         
137         $femalePhotoIndex = 0;
138         $malePhotoIndex   = 0;
139         
140         $indexes = fgetcsv($fhcsv);
141         
142         while ($row = fgetcsv($fhcsv)) {
143             foreach($row as $index => $field) {
144                 if ($indexes[$index] == 'gender') {
145                     if ($field == 'male') {
146                         $isMan = true;
147                         $this->_addresses[$i]['salutation'] = 'MR';
148                     } else {
149                         $isMan = false;
150                         $this->_addresses[$i]['salutation'] = 'MS';
151                     }
152                 } else {
153                     $this->_addresses[$i][$indexes[$index]] = $field;
154                 }
155             }
156             
157             // get the base64 encoded photo
158             $photo = fgets($fhimages);
159             
160             // if photo exists, add to photo index
161             if (! empty($photo)) {
162                 if ($isMan) {
163                     $this->_photosMale[] = $i;
164                 } else {
165                     $this->_photosFemale[] = $i;
166                 }
167             // if no photo exists, take from photo index
168             } else {
169                 if ($isMan) {
170                     $photo = $this->_images[$this->_photosMale[$malePhotoIndex]];
171                     $malePhotoIndex++;
172                 } else {
173                     $photo = $this->_images[$this->_photosFemale[$femalePhotoIndex]];
174                     $femalePhotoIndex++;
175                 }
176             }
177             
178             $this->_images[$i] = $photo;
179             
180             $i++;
181         }
182         fclose($fhcsv);
183         fclose($fhimages);
184     }
185     
186     /**
187      * creates a contact and the image, if given
188      */
189     protected function _createContact($data, $imageData)
190     {
191         $record = new Addressbook_Model_Contact($data);
192         $be = new Addressbook_Backend_Sql();
193         $imageData = base64_decode($imageData);
194         try {
195             $record = $this->_controller->create($record);
196             if ($imageData) {
197                 // @todo We should not use copyrighted/random pictures for demo data
198                 //$be->_saveImage($record->getId(), $imageData);
199             }
200         } catch (Exception $e) {
201             echo 'Skipping: ' . $data['n_given'] .' ' . $data['n_family'] . ($data['org_name'] ? ' ('.$data['org_name'].') ' : '') . $e->getMessage() . PHP_EOL;
202         }
203     }
204     
205     /**
206      * creates 700 shared contacts
207      */
208     protected function _createSharedContacts()
209     {
210         $count = static::$_createFullData ? 700 : 20;
211         
212         $this->_createSharedContainer((static::$_en ? 'Customers' : 'Kunden'));
213         $cid = $this->_sharedContainer->getId();
214         $i = 0;
215         while ($i < $count) {
216             $data = array_merge($this->_addresses[($this->_createdContactIndex + $i)], array('container_id' => $cid));
217             $this->_createContact($data, $this->_images[($this->_createdContactIndex + $i)]);
218             $i++;
219         }
220         $this->_createdContactIndex = $this->_createdContactIndex + $i;
221     }
222     
223     /**
224      * creates 100 contacts for pwulf
225      */
226     protected function _createContactsForPwulf()
227     {
228         $i=0;
229         while ($i < (static::$_createFullData ? 100 : 10)) {
230             $this->_createContact($this->_addresses[$this->_createdContactIndex+$i], $this->_images[($this->_createdContactIndex+$i)]);
231             $i++;
232         }
233         $this->_createdContactIndex = $this->_createdContactIndex + $i;
234     }
235
236     /**
237      * creates 100 contacts for rwright
238      */
239     protected function _createContactsForRwright()
240     {
241         $i=0;
242         while ($i < (static::$_createFullData ? 100 : 10)) {
243             $this->_createContact($this->_addresses[$this->_createdContactIndex+$i], $this->_images[($this->_createdContactIndex+$i)]);
244             $i++;
245         }
246         $this->_createdContactIndex = $this->_createdContactIndex + $i;
247     }
248
249     /**
250      * creates 100 contacts for sclever
251      */
252     protected function _createContactsForSclever()
253     {
254         $i=0;
255         while ($i < (static::$_createFullData ? 100 : 10)) {
256             $this->_createContact($this->_addresses[$this->_createdContactIndex+$i], $this->_images[($this->_createdContactIndex+$i)]);
257             $i++;
258         }
259         $this->_createdContactIndex = $this->_createdContactIndex + $i;
260     }
261 }