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

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

When an application has a development and non-development version, only list the non-development version. Fixes #53

File size: 5.2 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                'Doctype' => array('unique' => true),
35                'Format' => array('unique' => true),
36        );
37
38        /** @var array Job queries can be quite complex, so use Containable */
39        public $actsAs = array('Containable');
40
41        /**
42         * Set validation rules in here so we can have i18n messages
43         */
44        public function beforeValidate()
45        {
46                $this->validate = array(
47                        'version' => array(
48                                'rule' => array('custom', '/^[a-z0-9(). -]{1,}$/i'),
49                                'message' => __('Only letters, numbers, dashes, parenthesis, the dot (.) and spaces allowed.', true)
50                        )
51                );
52
53                return True;
54        }
55
56        /**
57         * Get a list of all active worker types. That is, unique combinations of Platform, Doctype and Application
58         * @param boolean $stable If true, return only stable factories that want to participate in test suites
59         * @return array
60         */
61        public function getActive($stable = false)
62        {
63                App::import('Sanitize');
64                $time = date('Y-m-d H:i:s', time() - Configure::read('Factory.polltime'));
65
66                if ($stable) {
67                        $stableTime = date('Y-m-d H:i:s', time() - Configure::read('Factory.stabletime'));
68                        $sqlWhere = "AND `Factory`.`active_since` != '0000-00-00 00:00:00'
69                                     AND `Factory`.`active_since` < '$stableTime'
70                                     AND `Worker`.`testsuite` = 1";
71                } else {
72                        $sqlWhere = '';
73                }
74
75                $active = $this->query("SELECT DISTINCT
76                                `Worker`.`version`,
77                                `Worker`.`development`,
78                                `Platform`.`id`,
79                                `Platform`.`name`,
80                                `Doctype`.`id`,
81                                `Doctype`.`name`,
82                                `Doctype`.`code`,
83                                `Application`.`id`,
84                                `Application`.`name`
85                        FROM `workers` AS `Worker`
86                        LEFT JOIN `factories` AS `Factory` ON (`Worker`.`factory_id` = `Factory`.`id`)
87                        LEFT JOIN `operatingsystems` AS `Operatingsystem` ON (`Factory`.`operatingsystem_id` = `Operatingsystem`.`id`)
88                        LEFT JOIN `platforms` AS `Platform` ON (`Operatingsystem`.`platform_id` = `Platform`.`id`)
89                        LEFT JOIN `applications` AS `Application` ON (`Worker`.`application_id` = `Application`.`id`)
90                        LEFT JOIN `doctypes_workers` AS `DoctypesWorker` ON `Worker`.`id` = `DoctypesWorker`.`worker_id`
91                        LEFT JOIN `doctypes` AS `Doctype` ON (`DoctypesWorker`.`doctype_id` = `Doctype`.`id`)
92                        WHERE `Factory`.`last_poll` > '$time'
93                                $sqlWhere
94                        ORDER BY `Platform`.`name` ASC, `Application`.`name` ASC, `Worker`.`version`, `Worker`.`development` ASC");
95
96                if (is_array($active)) {
97                        $prev_ids = array();
98                        $result = array();
99
100                        foreach ($active as $i => $app) {
101                                $active[$i]['id'] = $app['Platform']['id'] . '_' . $app['Doctype']['code'] . '_' . $app['Application']['id'] . '_'
102                                        . $app['Worker']['version'];
103                               
104                                if (in_array($active[$i]['id'], $prev_ids)) {
105                                        // This is a development version of the previous application. Don't list it.
106                                        continue;
107                                }
108                                $prev_ids[] = $active[$i]['id'];
109
110                                $formats = $this->query("SELECT DISTINCT
111                                                `Format`.`id`,
112                                                `Format`.`code`
113                                        FROM `workers` AS `Worker`
114                                        LEFT JOIN `formats_workers` AS `FormatsWorker` ON (`Worker`.`id` = `FormatsWorker`.`worker_id`)
115                                        LEFT JOIN `formats` AS `Format` ON (`FormatsWorker`.`format_id` = `Format`.`id`)
116                                        LEFT JOIN `factories` AS `Factory` ON (`Worker`.`factory_id` = `Factory`.`id`)
117                                        LEFT JOIN `operatingsystems` AS `Operatingsystem` ON (`Factory`.`operatingsystem_id` = `Operatingsystem`.`id`)
118                                        LEFT JOIN `applications` AS `Application` ON (`Worker`.`application_id` = `Application`.`id`)
119                                        LEFT JOIN `doctypes_workers` AS `DoctypesWorker` ON `Worker`.`id` = `DoctypesWorker`.`worker_id`
120                                        WHERE `Factory`.`last_poll` > '$time'
121                                                $sqlWhere
122                                                AND `Worker`.`version` = '" . Sanitize::escape($app['Worker']['version']) . "'
123                                                AND `Application`.`id` = '" . $app['Application']['id'] . "'
124                                                AND `Operatingsystem`.`platform_id` = '" . $app['Platform']['id'] . "'
125                                                AND `DoctypesWorker`.`doctype_id` = '" . $app['Doctype']['id'] . "'");
126
127                                $active[$i]['Format'] = array();
128                                foreach ($formats as $format) {
129                                        $active[$i]['Format'][] = $format['Format'];
130                                }
131
132                                $result[] = $active[$i];
133                        }
134
135                        return $result;
136                }
137                return array();
138        }
139}
140
141?>
Note: See TracBrowser for help on using the repository browser.