MTrackWeb.php
[web.mtrack] / MTrackWeb.php
1 <?php
2 /**
3  * every class extends this...
4  */
5  
6  
7 class MTrackWeb extends HTML_FlexyFramework_Page
8 {
9     var $template = 'wiki.html';
10     var $priorities = array();
11     var $severities = array();
12     var $link = false; // the link handler..
13     
14     function hasPerm($what, $cando) {
15         // our whole perm logic sits in here....
16         
17         // here's how it works
18         // a) anonymous users - not authenticated.
19         // - can see projects that are in *PUBLIC project "MTrack.Repos", "S"
20         // - can see bugs that are in *PUBLIC project "MTrack.Issue", "S"
21         // - can see bugs that are in *PUBLIC project "MTrack.Wiki", "S"
22         if (!$this->authUser) {
23             if ($cando = 'S' &&
24                     in_array( $what , array( 'MTrack.Repos', 'MTrack.Issue', 'MTrack.Wiki'))) {
25                 return true; // not a diffinative answer...
26             }
27             return false;
28         }
29         
30         // b) everything else is passed up to the authuser to work out..
31         
32         
33         throw new Exception ("not supported yet");
34         return MTrackACL::hasAnyRights($what, $cando);
35     }
36     
37     function getAuthUser()
38     {
39         $u = DB_DataObject::factory('Person');
40         if (!$u->isAuth()) {
41             return false;
42         }
43         return $u->getAuthUser();
44     }
45     /**
46      * base getAuth allows everyone in..
47      */
48     
49     function getAuth()
50     {
51         $this->registerClasses(); // to be destroyed??
52         
53         $ff = HTML_FlexyFramework::get();
54         if ($ff->cli) {
55             return true;
56         }
57         
58         // default timezone first..
59         $ff = HTML_FlexyFramework::get();
60         if (isset($ff->MTrack['timezone'])) {
61             date_default_timezone_set($ff->MTrack['timezone']);
62         }
63         
64         //MTrackConfig::boot(); // eak.. .remove me...
65       
66         $this->authUser = DB_DataObject::factory('Person')->getAuthUser();
67         if (!$this->authUser) {
68             return true; // we do allow people in this far..
69         }
70         
71          
72         // timezone setting... -- this may be a good addon to our core person class.
73         
74         if (!empty($this->authUser->timezone)) {
75             date_default_timezone_set($this->authUser->timezone);
76             return;
77         }
78          
79         /// fixme...
80         //$this->authUser = 
81         return true; // anyone at present..
82     }
83     function get($loc='')
84     {
85         // 
86         if (!empty($loc)) {
87             die ("invalid location". htmlspecialchars($loc));
88         }
89         if (!$this->authUser) {
90             die("wiki todo");
91             return HTML_FlexyFramework::run('Wiki'); 
92         }
93         return HTML_FlexyFramework::run('Wiki/Today'); 
94  
95     }
96     function post()
97     {
98         header("Status: 404 Not Found");
99         die("not valid");
100     }
101     
102     
103     function initOptions()
104     {
105         
106          
107         $q = MTrackDB::q('select priorityname, value from priorities');
108
109         foreach ($q->fetchAll() as $row) {
110             $this->priorities[$row[0]] = $row[1];
111         }
112         $q = MTrackDB::q('select sevname, ordinal from severities');
113         
114         foreach ($q->fetchAll() as $row) {
115             $this->severities[$row[0]] = $row[1];
116         }
117
118     }
119     
120     function registerClasses()
121     {
122         require_once 'MTrack/Wiki.php';
123         require_once 'MTrack/Wiki/Item.php';
124         require_once 'MTrack/Milestone.php';
125         //require_once 'MTrack/Report.php';
126         require_once 'MTrack/ACL.php';
127         require_once 'MTrack/SearchDB.php';
128         require_once 'MTrack/Watch.php'; 
129         require_once 'MTrack/CommitChecker.php'; 
130         //require_once 'MTrack/Repo.php';
131         //require_once 'MTrack/SCM/Git/Repo.php';
132         //require_once 'MTrack/SCM/Svn.php';
133         //require_once 'MTrack/SCM/Hg.php';
134         require_once 'MTrackWeb/LinkHandler.php';
135          require_once 'MTrack/Wiki/HTMLFormatter.php';
136         
137         $this->link = new MTrackWeb_LinkHandler();
138         MTrack_Wiki_HTMLFormatter::registerLinkHandler($this->link);
139         
140         //MTrackRepo::registerSCM('git', 'MTrack_SCM_Git_Repo');
141         //MTrackRepo::registerSCM('svn', 'MTrackSCMSVN');
142         //MTrackRepo::registerSCM('hg', 'MTrackSCMHg');
143
144         $r = DB_DataObject::factory('mtrack_repos');
145         $r->get('shortname', 'wiki'); // default wiki?
146         MTrack_Wiki_Item::$repo = $r->impl();
147         MTrack_Wiki::register_macro('MilestoneSummary', array('MTrack_Milestone', 'macro_MilestoneSummary'));
148         MTrack_Wiki::register_macro('BurnDown', array('MTrack_Milestone', 'macro_BurnDown'));
149         //MTrack_Wiki::register_macro('RunReport', array('MTrack_Report', 'macro_RunReport')); << fixme how are we to hanlde this..
150         MTrack_Wiki::register_macro('TicketQuery', array('MTrack_Report', 'macro_TicketQuery'));
151         MTrack_Wiki::register_macro('IncludeWikiPage', array('MTrack_Wiki', 'macro_IncludeWiki'));
152         MTrack_Wiki::register_macro('IncludeHelpPage', array('MTrack_Wiki', 'macro_IncludeHelp'));
153         MTrack_Wiki::register_macro('Comment', array('MTrack_Wiki', 'macro_comment'));
154         MTrack_Wiki::register_processor('comment', array('MTrack_Wiki', 'processor_comment'));
155         MTrack_Wiki::register_processor('html', array('MTrack_Wiki', 'processor_html'));
156         MTrack_Wiki::register_processor('dataset', array('MTrack_Wiki', 'processor_dataset'));
157
158
159         MTrackACL::registerAncestry('milestone', 'Roadmap');
160         MTrackACL::registerAncestry('report', 'Reports');
161         MTrackACL::registerAncestry('snippet', 'Snippets');
162         MTrackACL::registerAncestry('repo', 'Browser');
163         MTrackACL::registerAncestry('enum',     'Enumerations');
164         MTrackACL::registerAncestry("component", 'Components');
165         MTrackACL::registerAncestry("project",  'Projects');
166         MTrackACL::registerAncestry("ticket",   "Tickets");
167         MTrackACL::registerAncestry('wiki', array('MTrack_Wiki_Item', '_get_parent_for_acl'));
168
169         MTrackSearchDB::register_indexer('ticket', array('MTrackIssue', 'index_issue'));
170         MTrackSearchDB::register_indexer('wiki', array('MTrack_Wiki_Item', 'index_item'));
171
172
173
174         MTrackWatch::registerEventTypes('ticket', array( 'ticket' => 'Tickets' ));
175         MTrackWatch::registerEventTypes('milestone', array( 'ticket' => 'Tickets', 'changeset' => 'Code changes' ));
176         MTrackWatch::registerEventTypes('repo', array( 'ticket' => 'Tickets', 'changeset' => 'Code changes' ));
177
178         // should this get registered here??
179         MTrackCommitChecker::addCheck('Wiki');
180         
181         
182         
183    }
184     
185     function favicon()
186     {
187         return false;
188         /// FIXME - we should allow upload of a favion...
189         $ff = HTML_FlexyFramework::get();
190         
191         
192     }
193      
194     
195     /* renders the attachment list for a given object */
196     // was Attachments::render
197     // move it to MTrackWebAttachemnt...
198     
199   function attachmentsToHtml($object)
200   {
201     if (is_object($object)) {
202         $object = $object->toIdString(); // eg. ticket:1
203     }
204     $atts = MTrackDB::q('
205       select * from attachments
206       left join changes on (attachments.cid = changes.cid)
207       where attachments.object = ? order by changedate, filename',
208         $object)->fetchAll(PDO::FETCH_ASSOC);
209
210     if (count($atts) == 0) return '';
211
212     $max_dim = 150;
213
214     $html = "<div class='attachment-list'><b>Attachments</b><ul>";
215     foreach ($atts as $row) {
216       $url = "{$this->baseURL}/Attachment/$object/". $row['cid'] . '/' . $row['filename'];
217       
218       $html .= "<li><a class='attachment'" .
219         " href='$url'>".
220         "$row[filename]</a> ($row[size]) added by " .
221         $this->link->username($row['who'], array(
222           'no_image' => true
223         )) .
224         " " . $this->link->date($row['changedate']);
225         require_once 'MTrack/Attachment.php';
226       list($width, $height) = getimagesize(MTrackAttachment::local_path($row['hash']));
227       if ($width + $height) {
228         /* limit maximum size */
229         if ($width > $max_dim) {
230           $height *= $max_dim / $width;
231           $width = $max_dim;
232         }
233         if ($height > $max_dim) {
234           $width *= $max_dim / $height;
235           $height = $max_dim;
236         }
237         $html .= "<br><a href='$url'><img src='$url' width='$width' border='0' height='$height'></a>";
238       }
239
240       $html .= "</li>\n";
241     }
242     $html .= "</ul></div>";
243     return $html;
244   }
245     
246     
247
248 }