source: trunk/server/www/app/models/worker.php @ 297

Last change on this file since 297 was 297, checked in by sander, 11 years ago

Generate and display jobs and results for test suites

File size: 5.5 KB
Line 
1<?php
2/**
3 * Officeshots.org - Test your office documents in different applications
4 * Copyright (C) 2009 Stichting Lone Wolves
5 * Written by Sander Marechal <s.marechal@jejik.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21/**
22 * The Application model
23 *
24 * An Application is a specific instance of an office suite application running
25 * on a specific factory.
26 */
27class Worker extends AppModel
28{
29        /** @var string Every application runs on a factory and belongs to an application type */
30        public $belongsTo = array('Factory', 'Application');
31
32        /** @var array Every application supports one or more output formats */
33        public $hasAndBelongsToMany = array(
34                'Format' => array('unique' => true)
35        );
36
37        /** @var array Job queries can be quite complex, so use Containable */
38        public $actsAs = array('Containable');
39
40        /**
41         * Set validation rules in here so we can have i18n messages
42         */
43        public function beforeValidate()
44        {
45                $this->validate = array(
46                        'version' => array(
47                                'rule' => array('custom', '/^[a-z0-9(). -]{1,}$/i'),
48                                'message' => __('Only letters, numbers, dashes, parenthesis, the dot (.) and spaces allowed.', true)
49                        )
50                );
51
52                return True;
53        }
54
55        /**
56         * Get a list of all active worker types. That is, unique combinations of Platform, Doctype and Application
57         * @param boolean $stable If true, return only stable factories
58         * @return array
59         */
60        public function getActive($stable = false)
61        {
62                App::import('Sanitize');
63                $time = date('Y-m-d H:i:s', time() - Configure::read('Factory.polltime'));
64
65                if ($stable) {
66                        $stableTime = date('Y-m-d H:i:s', time() - Configure::read('Factory.stabletime'));
67                        $sqlWhere = "AND `Factory`.`active_since` != '0000-00-00 00:00:00'
68                                     AND `Factory`.`active_since` < '$stableTime'
69                                     AND `Worker`.`development` = 0";
70                } else {
71                        $sqlWhere = '';
72                }
73
74                $active = $this->query("SELECT DISTINCT
75                                `Worker`.`version`,
76                                `Worker`.`development`,
77                                `Platform`.`id`,
78                                `Platform`.`name`,
79                                `Doctype`.`id`,
80                                `Doctype`.`name`,
81                                `Doctype`.`code`,
82                                `Application`.`id`,
83                                `Application`.`name`
84                        FROM `workers` AS `Worker`
85                        LEFT JOIN `factories` AS `Factory` ON (`Worker`.`factory_id` = `Factory`.`id`)
86                        LEFT JOIN `operatingsystems` AS `Operatingsystem` ON (`Factory`.`operatingsystem_id` = `Operatingsystem`.`id`)
87                        LEFT JOIN `platforms` AS `Platform` ON (`Operatingsystem`.`platform_id` = `Platform`.`id`)
88                        LEFT JOIN `applications` AS `Application` ON (`Worker`.`application_id` = `Application`.`id`)
89                        LEFT JOIN `applications_doctypes` AS `ApplicationsDoctype` ON `Application`.`id` = `ApplicationsDoctype`.`application_id`
90                        LEFT JOIN `doctypes` AS `Doctype` ON (`ApplicationsDoctype`.`doctype_id` = `Doctype`.`id`)
91                        WHERE `Factory`.`last_poll` > '$time'
92                                $sqlWhere
93                        ORDER BY `Platform`.`name` ASC, `Application`.`name` ASC, `Worker`.`version` ASC");
94
95                if (is_array($active)) {
96                        foreach ($active as &$app) {
97                                $app['id'] = $app['Platform']['id'] . '_' . $app['Doctype']['code'] . '_' . $app['Application']['id'] . '_'
98                                           . $app['Worker']['version'];
99
100                                $formats = $this->query("SELECT DISTINCT
101                                                `Format`.`id`,
102                                                `Format`.`code`
103                                        FROM `workers` AS `Worker`
104                                        LEFT JOIN `formats_workers` AS `FormatsWorker` ON (`Worker`.`id` = `FormatsWorker`.`worker_id`)
105                                        LEFT JOIN `formats` AS `Format` ON (`FormatsWorker`.`format_id` = `Format`.`id`)
106                                        LEFT JOIN `factories` AS `Factory` ON (`Worker`.`factory_id` = `Factory`.`id`)
107                                        LEFT JOIN `operatingsystems` AS `Operatingsystem` ON (`Factory`.`operatingsystem_id` = `Operatingsystem`.`id`)
108                                        LEFT JOIN `applications` AS `Application` ON (`Worker`.`application_id` = `Application`.`id`)
109                                        LEFT JOIN `applications_doctypes` AS `ApplicationsDoctype` ON `Application`.`id` = `ApplicationsDoctype`.`application_id`
110                                        WHERE `Factory`.`last_poll` > '$time'
111                                                $sqlWhere
112                                                AND `Worker`.`version` = '" . Sanitize::escape($app['Worker']['version']) . "'
113                                                AND `Application`.`id` = '" . $app['Application']['id'] . "'
114                                                AND `Operatingsystem`.`platform_id` = '" . $app['Platform']['id'] . "'
115                                                AND `ApplicationsDoctype`.`doctype_id` = '" . $app['Doctype']['id'] . "'");
116
117                                $app['Format'] = array();
118                                foreach ($formats as $format) {
119                                        $app['Format'][] = $format['Format'];
120                                }
121                        }
122                        return $active;
123                }
124                return array();
125        }
126
127        /**
128         * Get a list of all worker application names and versions, grouped by ODF doctype and platform
129         *
130         * @param integer $time Maximum time since the last poll, in minutes
131         * @return array A nested array
132         */
133        public function getActiveGrouped($time = 10)
134        {
135                $result = array();
136                $doctypes = $this->Application->Doctype->find('all');
137                $platforms = $this->Factory->Operatingsystem->Platform->find('all');
138
139                foreach ($doctypes as $doctype) {
140                        foreach ($platforms as $platform) {
141                                $result[$doctype['Doctype']['name']][$platform['Platform']['name']] = array();
142                        }
143                }
144
145                $active = $this->getActive();
146                return $active;
147        }
148}
149
150?>
Note: See TracBrowser for help on using the repository browser.