source: peerreviewplugin/tags/0.12/3.1/codereview/tracgenericworkflow/model.py

Last change on this file was 16451, checked in by Ryan J Ollos, 6 years ago

Fix indentation

File size: 5.2 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2010-2015 Roberto Longobardi
4#
5# This file is part of the Test Manager plugin for Trac.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution. The terms
9# are also available at:
10#   https://trac-hacks.org/wiki/TestManagerForTracPluginLicense
11#
12# Author: Roberto Longobardi <otrebor.dev@gmail.com>
13#
14
15from trac.core import Component, implements
16from trac.db import Table, Column
17from trac.env import IEnvironmentSetupParticipant
18from trac.util.translation import N_
19
20from codereview.tracgenericclass.model import IConcreteClassProvider, AbstractVariableFieldsObject, \
21    need_db_create_for_realm, create_db_for_realm, need_db_upgrade_for_realm, upgrade_db_for_realm
22
23
24class ResourceWorkflowState(AbstractVariableFieldsObject):
25    """
26    This object represents the current workflow state of the associated
27    resource.
28    """
29
30    # Fields that must not be modified directly by the user
31    protected_fields = ('id', 'res_realm', 'state')
32
33    def __init__(self, env, id_=None, res_realm=None, state='new', db=None):
34        """
35        The resource workflow state is related to a resource, the 'id'
36        and 'res_realm' arguments.
37        The state can be any string.
38        """
39        self.values = {}
40
41        self.values['id'] = id_
42        self.values['res_realm'] = res_realm
43        self.values['state'] = state
44
45        key = self.build_key_object()
46
47        AbstractVariableFieldsObject.__init__(self, env, 'resourceworkflowstate', key, db)
48
49    def get_key_prop_names(self):
50        return ['id', 'res_realm']
51
52    def create_instance(self, key):
53        return ResourceWorkflowState(self.env, key['id'], key['res_realm'])
54
55
56class GenericWorkflowModelProvider(Component):
57    """
58    This class provides the data model for the generic workflow plugin.
59
60    The actual data model on the db is created starting from the
61    SCHEMA declaration below.
62    For each table, we specify whether to create also a '_custom' and
63    a '_change' table.
64
65    This class also provides the specification of the available fields
66    for each class, being them standard fields and the custom fields
67    specified in the trac.ini file.
68    The custom field specification follows the same syntax as for
69    Tickets.
70    Currently, only 'text' type of custom fields are supported.
71    """
72
73    implements(IConcreteClassProvider, IEnvironmentSetupParticipant)
74
75    SCHEMA = {
76                'resourceworkflowstate':
77                    {'table':
78                        Table('resourceworkflowstate', key = ('id', 'res_realm'))[
79                              Column('id'),
80                              Column('res_realm'),
81                              Column('state')],
82                     'has_custom': True,
83                     'has_change': True,
84                     'version': 1}
85            }
86
87    FIELDS = {
88                'resourceworkflowstate': [
89                    {'name': 'id', 'type': 'text', 'label': N_('ID')},
90                    {'name': 'res_realm', 'type': 'text', 'label': N_('Resource realm')},
91                    {'name': 'state', 'type': 'text', 'label': N_('Workflow state')}
92                ]
93            }
94
95    METADATA = {
96                'resourceworkflowstate': {
97                        'label': "Workflow State",
98                        'searchable': False,
99                        'has_custom': True,
100                        'has_change': True
101                    },
102                }
103
104
105    # IConcreteClassProvider methods
106    def get_realms(self):
107        yield 'resourceworkflowstate'
108
109    def get_data_models(self):
110        return self.SCHEMA
111
112    def get_fields(self):
113        return self.FIELDS
114
115    def get_metadata(self):
116        return self.METADATA
117
118    def create_instance(self, realm, key=None):
119        obj = None
120
121        if realm == 'resourceworkflowstate':
122            if key is not None:
123                obj = ResourceWorkflowState(self.env, key['id'], key['res_realm'])
124            else:
125                obj = ResourceWorkflowState(self.env)
126
127        return obj
128
129    def check_permission(self, req, realm, key_str=None, operation='set', name=None, value=None):
130        pass
131
132    # IEnvironmentSetupParticipant methods
133    def environment_created(self):
134        self.upgrade_environment()
135
136    def environment_needs_upgrade(self, db=None):
137        for realm in self.SCHEMA:
138            realm_metadata = self.SCHEMA[realm]
139
140            if need_db_create_for_realm(self.env, realm, realm_metadata, db) or \
141                need_db_upgrade_for_realm(self.env, realm, realm_metadata, db):
142
143                return True
144
145        return False
146
147    def upgrade_environment(self, db=None):
148        # Create or update db
149        @self.env.with_transaction(db)
150        def do_upgrade_environment(db):
151            for realm in self.SCHEMA:
152                realm_metadata = self.SCHEMA[realm]
153
154                if need_db_create_for_realm(self.env, realm, realm_metadata, db):
155                    create_db_for_realm(self.env, realm, realm_metadata, db)
156
157                elif need_db_upgrade_for_realm(self.env, realm, realm_metadata, db):
158                    upgrade_db_for_realm(self.env, 'tracgenericworkflow.upgrades', realm, realm_metadata, db)
Note: See TracBrowser for help on using the repository browser.