class Identity(orm.BaseModel): _kind = 64 _use_rule_engine = False identity = orm.SuperStringProperty('1', required=True) # This property stores provider name joined with ID. email = orm.SuperStringProperty('2', required=True) associated = orm.SuperBooleanProperty('3', required=True, default=True) primary = orm.SuperBooleanProperty('4', required=True, default=True)
class UOM(orm.BaseExpando): _kind = 72 _use_rule_engine = False measurement = orm.SuperStringProperty('1', required=True, indexed=False) name = orm.SuperStringProperty('2', required=True, indexed=False) symbol = orm.SuperStringProperty('3', required=True, indexed=False) rate = orm.SuperDecimalProperty('4', required=True, indexed=False) factor = orm.SuperDecimalProperty('5', required=True, indexed=False) rounding = orm.SuperDecimalProperty('6', required=True, indexed=False) digits = orm.SuperIntegerProperty('7', required=True, indexed=False) _default_indexed = False _expando_fields = { 'code': orm.SuperStringProperty('8', required=True), 'numeric_code': orm.SuperStringProperty('9'), 'grouping': orm.SuperIntegerProperty('10', repeated=True), 'decimal_separator': orm.SuperStringProperty('11', required=True), 'thousands_separator': orm.SuperStringProperty('12'), 'positive_sign_position': orm.SuperIntegerProperty('13', required=True), 'negative_sign_position': orm.SuperIntegerProperty('14', required=True), 'positive_sign': orm.SuperStringProperty('15'), 'negative_sign': orm.SuperStringProperty('16'), 'positive_currency_symbol_precedes': orm.SuperBooleanProperty('17', default=True), 'negative_currency_symbol_precedes': orm.SuperBooleanProperty('18', default=True), 'positive_separate_by_space': orm.SuperBooleanProperty('19', default=True), 'negative_separate_by_space': orm.SuperBooleanProperty('20', default=True) }
class Address(orm.BaseExpando): _kind = 9 _use_rule_engine = False internal_id = orm.SuperStringProperty( '1', required=True, indexed=False ) # md5 hash => <timestamp>-<random_str>-<name>-<city>-<postal code>-<street>-<default_shipping>-<default_billing> name = orm.SuperStringProperty('2', required=True, indexed=False) country = orm.SuperKeyProperty('3', kind='15', required=True, indexed=False) city = orm.SuperStringProperty('4', required=True, indexed=False) postal_code = orm.SuperStringProperty('5', required=True, indexed=False) street = orm.SuperStringProperty('6', required=True, indexed=False) default_shipping = orm.SuperBooleanProperty('7', required=True, default=True, indexed=False) default_billing = orm.SuperBooleanProperty('8', required=True, default=True, indexed=False) _default_indexed = False _expando_fields = { 'region': orm.SuperKeyProperty('9', kind='16'), 'email': orm.SuperStringProperty('10'), 'telephone': orm.SuperStringProperty('11') } _virtual_fields = { '_country': orm.SuperReferenceStructuredProperty('15', autoload=True, target_field='country'), '_region': orm.SuperReferenceStructuredProperty('16', autoload=True, target_field='region') }
class Role(orm.BaseExpando): _kind = 66 # feature proposition (though it should create overhead due to the required drilldown process!) # parent_record = orm.SuperKeyProperty('1', kind='Role', indexed=False) # complete_name = orm.SuperTextProperty('2') name = orm.SuperStringProperty('1', required=True) active = orm.SuperBooleanProperty('2', required=True, default=True) permissions = orm.SuperPickleProperty('3', required=True, default=[], compressed=False) # List of Permissions instances. Validation is required against objects in this list, if it is going to be stored in datastore. _default_indexed = False def run(self, context): for permission in self.permissions: permission.run(self, context)
class Notification(orm.BaseExpando): _kind = 61 name = orm.SuperStringProperty('1', required=True) action = orm.SuperKeyProperty('2', kind='56', required=True) condition = orm.SuperStringProperty('3', required=True, indexed=False) active = orm.SuperBooleanProperty('4', required=True, default=True) templates = orm.SuperPickleProperty('5', required=True, indexed=False, compressed=False) _default_indexed = False _virtual_fields = {'_records': orm.SuperRecordProperty('61')} _global_role = GlobalRole(permissions=[ orm.ActionPermission( '61', [ orm.Action.build_key('61', 'prepare'), orm.Action.build_key('61', 'create'), orm.Action.build_key('61', 'read'), orm.Action.build_key('61', 'update'), orm.Action.build_key('61', 'delete'), orm.Action.build_key('61', 'search') ], False, 'entity._original.namespace_entity._original.state != "active"'), orm.ActionPermission('61', [ orm.Action.build_key('61', 'initiate'), orm.Action.build_key('61', 'send_mail'), orm.Action.build_key('61', 'send_http') ], False, 'True'), orm.ActionPermission( '61', [ orm.Action.build_key('61', 'initiate'), orm.Action.build_key('61', 'send_mail'), orm.Action.build_key('61', 'send_http') ], True, 'entity._original.namespace_entity._original.state == "active" and user._is_taskqueue' ), orm.FieldPermission( '61', ['name', 'action', 'condition', 'active', 'templates', '_records'], False, False, 'entity._original.namespace_entity._original.state != "active"') ]) _actions = [ orm.Action(key=orm.Action.build_key('61', 'prepare'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_notification' }}) ]) ]), orm.Action( key=orm.Action.build_key('61', 'create'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'name': orm.SuperStringProperty(required=True), 'action': orm.SuperVirtualKeyProperty(required=True, kind='56'), 'condition': orm.SuperTextProperty(required=True), 'active': orm.SuperBooleanProperty(), 'templates': orm.SuperMultiLocalStructuredProperty(('58', '63'), repeated=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_notification.name': 'input.name', '_notification.action': 'input.action', '_notification.condition': 'input.condition', '_notification.active': 'input.active', '_notification.templates': 'input.templates' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_notification' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action(key=orm.Action.build_key('61', 'read'), arguments={ 'key': orm.SuperKeyProperty(kind='61', required=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_notification' }}) ]) ]), orm.Action( key=orm.Action.build_key('61', 'update'), arguments={ 'key': orm.SuperKeyProperty(required=True, kind='61'), 'name': orm.SuperStringProperty(required=True), 'action': orm.SuperVirtualKeyProperty(required=True, kind='56'), 'condition': orm.SuperTextProperty(required=True), 'active': orm.SuperBooleanProperty(), 'templates': orm.SuperMultiLocalStructuredProperty(('58', '63'), repeated=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_notification.name': 'input.name', '_notification.action': 'input.action', '_notification.condition': 'input.condition', '_notification.active': 'input.active', '_notification.templates': 'input.templates' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_notification' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action( key=orm.Action.build_key('61', 'delete'), arguments={'key': orm.SuperKeyProperty(required=True, kind='61')}, _plugin_groups=[ orm.PluginGroup( plugins=[Context( ), Read(), RulePrepare(), RuleExec()]), orm.PluginGroup( transactional=True, plugins=[ Delete(), Set(cfg={'d': { 'output.entity': '_notification' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action(key=orm.Action.build_key('61', 'search'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'search': orm.SuperSearchProperty( default={ 'filters': [], 'orders': [{ 'field': 'name', 'operator': 'asc' }] }, cfg={ 'search_arguments': { 'kind': '61', 'options': { 'limit': settings.SEARCH_PAGE } }, 'filters': { 'name': orm.SuperStringProperty(), 'action': orm.SuperVirtualKeyProperty(kind='56'), 'active': orm.SuperBooleanProperty() }, 'indexes': [{ 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('action', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('action', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('name', ['==', '!=']), ('action', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }] }) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities'}), Set( cfg={ 'd': { 'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more' } }) ]) ]), orm.Action( key=orm.Action.build_key('61', 'initiate'), arguments={ 'caller_entity': orm.SuperKeyProperty(required=True), 'caller_user': orm.SuperKeyProperty(required=True, kind='0'), 'caller_action': orm.SuperVirtualKeyProperty(required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Set(cfg={ 'd': { '_caller_entity': 'input.caller_entity.entity' } }), Read(cfg={'namespace': '_caller_entity.key_namespace'}), RulePrepare(), RuleExec(), NotificationInitiate(), CallbackExec() ]) ]), orm.Action( key=orm.Action.build_key('61', 'send_mail'), arguments={ 'recipient': orm.SuperStringProperty(repeated=True), 'subject': orm.SuperTextProperty(required=True), 'body': orm.SuperTextProperty(required=True), 'caller_entity': orm.SuperKeyProperty(required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Set(cfg={ 'd': { '_caller_entity': 'input.caller_entity.entity' } }), Read(cfg={'namespace': '_caller_entity.key_namespace'}), RulePrepare(), RuleExec(), NotificationMailSend(cfg={'sender': settings.NOTIFY_EMAIL}) ]) ]), orm.Action( key=orm.Action.build_key('61', 'send_http'), arguments={ 'recipient': orm.SuperStringProperty(required=True), 'subject': orm.SuperTextProperty(required=True), 'body': orm.SuperTextProperty(required=True), 'caller_entity': orm.SuperKeyProperty(required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Set(cfg={ 'd': { '_caller_entity': 'input.caller_entity.entity' } }), Read(cfg={'namespace': '_caller_entity.key_namespace'}), RulePrepare(), RuleExec(), NotificationHttpSend() ]) ]) ]
class Category(orm.BaseExpando): _kind = 47 created = orm.SuperDateTimeProperty('1', required=True, auto_now_add=True) updated = orm.SuperDateTimeProperty('2', required=True, auto_now=True) parent_record = orm.SuperKeyProperty('3', kind='47') name = orm.SuperStringProperty('4', required=True) complete_name = orm.SuperTextProperty('5', required=True) active = orm.SuperBooleanProperty('6', required=True, default=True) _default_indexed = False ###################################################### # Primitive example of real time balance calculator! # ###################################################### @classmethod def _get_children(cls, parent_records, children): entities = [] for parent_record in parent_records: entities.extend(cls.query(cls.parent_record == parent_record).fetch(keys_only=True)) if len(entities): children.extend(entities) cls._get_children(entities, children) @classmethod def _get_balance(cls, category): debit = 0 credit = 0 lines = Line.query(Line.categories.IN(category._children_records)).fetch() for line in lines: debit += line.debit credit += line.credit return (debit, credit, (debit - credit)) @classmethod def _post_get_hook(cls, key, future): # @todo Missing super extension! entity = future.get_result() if entity is not None and entity.key: entity._children_records = [entity.key] entity._get_children([entity.key], entity._children_records) entity._debit, entity._credit, entity._balance = entity._get_balance(entity) ################### # End of example! # ################### _expando_fields = { 'description': orm.SuperTextProperty('7'), 'balances': orm.SuperLocalStructuredProperty(CategoryBalance, '8', repeated=True) } _virtual_fields = { '_records': orm.SuperRecordProperty('47'), '_code': orm.SuperComputedProperty(lambda self: self.key_id_str) #'_debit': orm.SuperComputedProperty(lambda self: self._debit), #'_credit': orm.SuperComputedProperty(lambda self: self._credit), #'_balance': orm.SuperComputedProperty(lambda self: self._balance), } _global_role = GlobalRole( permissions=[ orm.ActionPermission('47', [orm.Action.build_key('47', 'prepare'), orm.Action.build_key('47', 'create'), orm.Action.build_key('47', 'read'), orm.Action.build_key('47', 'update'), orm.Action.build_key('47', 'delete'), orm.Action.build_key('47', 'search')], False, 'entity._original.namespace_entity._original.state != "active"'), orm.ActionPermission('47', [orm.Action.build_key('47', 'create'), orm.Action.build_key('47', 'update'), orm.Action.build_key('47', 'delete')], False, 'entity._is_system'), orm.ActionPermission('47', [orm.Action.build_key('47', 'delete')], False, 'entity._is_used'), orm.FieldPermission('47', ['created', 'updated'], False, None, 'True'), orm.FieldPermission('47', ['created', 'updated', 'parent_record', 'name', 'complete_name', 'active', 'description', 'balances', '_records', '_code'], False, False, 'entity._original.namespace_entity._original.state != "active"'), orm.FieldPermission('47', ['created', 'updated', 'parent_record', 'name', 'complete_name', 'active', 'description', 'balances', '_records', '_code'], False, None, 'entity._is_system') ] ) _actions = [ orm.Action( key=orm.Action.build_key('47', 'prepare'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True) }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': {'output.entity': '_category'}}) ] ) ] ), orm.Action( key=orm.Action.build_key('47', 'create'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), '_code': orm.SuperStringProperty(required=True, max_size=64), # Regarding max_size, take a look at the transaction.CategoryUpdateRead() plugin! 'parent_record': orm.SuperKeyProperty(kind='47'), 'name': orm.SuperStringProperty(required=True), 'active': orm.SuperBooleanProperty(required=True, default=True), 'description': orm.SuperTextProperty() }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), CategoryUpdateSet(), # @todo Unless we decide to implement that complete_name handling property, this will stay. RulePrepare(), RuleExec() ] ), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': {'output.entity': '_category'}}), CallbackNotify(), CallbackExec() ] ) ] ), orm.Action( key=orm.Action.build_key('47', 'read'), arguments={ 'key': orm.SuperKeyProperty(kind='47', required=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': {'output.entity': '_category'}}) ] ) ] ), orm.Action( key=orm.Action.build_key('47', 'update'), arguments={ 'key': orm.SuperKeyProperty(kind='47', required=True), 'parent_record': orm.SuperKeyProperty(kind='47'), 'name': orm.SuperStringProperty(required=True), 'active': orm.SuperBooleanProperty(required=True, default=True), 'description': orm.SuperTextProperty() }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), CategoryUpdateSet(), # @todo Unless we decide to implement that complete_name handling property, this will stay. RulePrepare(), RuleExec() ] ), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': {'output.entity': '_category'}}), CallbackNotify(), CallbackExec() ] ) ] ), orm.Action( key=orm.Action.build_key('47', 'delete'), arguments={ 'key': orm.SuperKeyProperty(kind='47', required=True) }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(), RuleExec() ] ), orm.PluginGroup( transactional=True, plugins=[ Delete(), Set(cfg={'d': {'output.entity': '_category'}}), CallbackNotify(), CallbackExec() ] ) ] ), orm.Action( key=orm.Action.build_key('47', 'search'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'search': orm.SuperSearchProperty( default={'filters': [{'field': 'active', 'value': True, 'operator': '=='}], 'orders': [{'field': 'name', 'operator': 'asc'}]}, cfg={ 'search_by_keys': True, 'search_arguments': {'kind': '47', 'options': {'limit': settings.SEARCH_PAGE}}, 'filters': {'name': orm.SuperStringProperty(), 'active': orm.SuperBooleanProperty()}, 'indexes': [{'orders': [('name', ['asc', 'desc'])]}, {'orders': [('created', ['asc', 'desc'])]}, {'orders': [('updated', ['asc', 'desc'])]}, {'orders': [('active', ['asc', 'desc'])]}, {'filters': [('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])]}, {'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])]}, {'filters': [('active', ['==']), ('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])]}] } ) }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities'}), Set(cfg={'d': {'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more'}}) ] ) ] ) ] @classmethod def prepare_key(cls, input, **kwargs): code = input.get('_code') return cls.build_key(code, namespace=kwargs.get('namespace')) # @todo Possible prefix? @property def _is_system(self): return self.key_id_str.startswith('system_') @property def _is_used(self): if self.key.id() is None: return False category = self.query(self.__class__.parent_record == self.key).get() line = Line.query(Line.categories == self.key).get() return (category is not None) or (line is not None)
from google.appengine.ext.ndb.google_imports import entity_pb from app import orm, settings from app.models import uom from app.models.base import * from app.plugins.base import * from app.plugins.transaction import * defaults1 = () defaults2 = ('required',) JOURNAL_FIELDS = ((orm.SuperStringProperty(), defaults1, defaults2), (orm.SuperTextProperty(), defaults1, defaults2), (orm.SuperIntegerProperty(), defaults1, defaults2), (orm.SuperFloatProperty(), defaults1, defaults2), (orm.SuperDecimalProperty(), defaults1, defaults2), (orm.SuperBooleanProperty(), defaults1, defaults2), (orm.SuperJsonProperty(), defaults1, defaults2), (orm.SuperKeyProperty(), defaults1, defaults2), (orm.SuperDateTimeProperty(), defaults1, defaults2)) class Action(orm.Action): _kind = 84 _use_rule_engine = False arguments = orm.SuperPropertyStorageProperty('2', required=True, default={}, compressed=False, cfg=JOURNAL_FIELDS) @classmethod def build_key(cls, *args, **kwargs): new_args = [cls._get_kind()]
class Widget(orm.BaseExpando): _kind = 62 _use_search_engine = True # @todo This is extra added for testing functions of google seach! name = orm.SuperStringProperty( '1', required=True, searchable=True ) # @todo This is extra added for testing functions of google seach! sequence = orm.SuperIntegerProperty( '2', required=True, searchable=True ) # @todo This is extra added for testing functions of google seach! active = orm.SuperBooleanProperty( '3', required=True, default=True, searchable=True ) # @todo This is extra added for testing functions of google seach! role = orm.SuperKeyProperty('4', kind='60', required=True) search_form = orm.SuperBooleanProperty('5', required=True, indexed=False, default=True) filters = orm.SuperLocalStructuredProperty(Filter, '6', repeated=True) _default_indexed = False _virtual_fields = {'_records': orm.SuperRecordProperty('62')} _global_role = GlobalRole(permissions=[ orm.ActionPermission( '62', [ orm.Action.build_key('62', 'prepare'), orm.Action.build_key('62', 'create'), orm.Action.build_key('62', 'read'), orm.Action.build_key('62', 'update'), orm.Action.build_key('62', 'delete'), orm.Action.build_key('62', 'search'), orm.Action.build_key('62', 'build_menu') ], False, 'entity._original.namespace_entity._original.state != "active"'), orm.ActionPermission('62', [ orm.Action.build_key('62', 'create'), orm.Action.build_key('62', 'update'), orm.Action.build_key('62', 'delete') ], False, 'entity._is_system'), orm.FieldPermission( '62', [ 'name', 'sequence', 'active', 'role', 'search_form', 'filters', '_records' ], False, False, 'entity._original.namespace_entity._original.state != "active"'), orm.FieldPermission('62', [ 'name', 'sequence', 'active', 'role', 'search_form', 'filters', '_records' ], False, None, 'entity._is_system'), orm.FieldPermission( '62', ['role'], False, None, '(action.key_id_str == "create" or action.key_id_str == "update") and (entity.role and entity.role._namespace != entity._original.key_namespace)' ) ]) _actions = [ orm.Action(key=orm.Action.build_key('62', 'prepare'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_widget' }}) ]) ]), orm.Action( key=orm.Action.build_key('62', 'create'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'name': orm.SuperStringProperty(required=True), 'sequence': orm.SuperIntegerProperty(required=True), 'active': orm.SuperBooleanProperty(default=True), 'role': orm.SuperKeyProperty(kind='60', required=True), 'search_form': orm.SuperBooleanProperty(default=True), 'filters': orm.SuperLocalStructuredProperty(Filter, repeated=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_widget.name': 'input.name', '_widget.sequence': 'input.sequence', '_widget.active': 'input.active', '_widget.role': 'input.role', '_widget.search_form': 'input.search_form', '_widget.filters': 'input.filters' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_widget' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action(key=orm.Action.build_key('62', 'read'), arguments={ 'key': orm.SuperKeyProperty(kind='62', required=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_widget' }}) ]) ]), orm.Action( key=orm.Action.build_key('62', 'update'), arguments={ 'key': orm.SuperKeyProperty(kind='62', required=True), 'name': orm.SuperStringProperty(required=True), 'sequence': orm.SuperIntegerProperty(required=True), 'active': orm.SuperBooleanProperty(default=True), 'role': orm.SuperKeyProperty(kind='60', required=True), 'search_form': orm.SuperBooleanProperty(default=True), 'filters': orm.SuperLocalStructuredProperty(Filter, repeated=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_widget.name': 'input.name', '_widget.sequence': 'input.sequence', '_widget.active': 'input.active', '_widget.role': 'input.role', '_widget.search_form': 'input.search_form', '_widget.filters': 'input.filters' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_widget' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action( key=orm.Action.build_key('62', 'delete'), arguments={'key': orm.SuperKeyProperty(kind='62', required=True)}, _plugin_groups=[ orm.PluginGroup( plugins=[Context( ), Read(), RulePrepare(), RuleExec()]), orm.PluginGroup( transactional=True, plugins=[ Delete(), Set(cfg={'d': { 'output.entity': '_widget' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action( key=orm.Action.build_key('62', 'search'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'search': orm.SuperSearchProperty( default={ 'filters': [], 'orders': [{ 'field': 'sequence', 'operator': 'asc' }] }, cfg={ 'use_search_engine': True, # @todo This is extra added for testing functions of google seach! 'search_arguments': { 'kind': '62', 'options': { 'limit': settings.SEARCH_PAGE } }, 'filters': { 'name': orm.SuperStringProperty(), 'role': orm.SuperKeyProperty(kind='60'), 'active': orm.SuperBooleanProperty() }, 'orders': { 'name': { 'default_value': { 'asc': 'a', 'desc': 'z' } }, # @todo This is extra added for testing functions of google seach! 'sequence': { 'default_value': { 'asc': 0, 'desc': 1000000 } } }, # @todo This is extra added for testing functions of google seach! 'indexes': [{ 'orders': [('name', ['asc', 'desc'])] }, { 'orders': [('sequence', ['asc', 'desc'])] }, { 'filters': [('name', ['==', '!='])], 'orders': [('sequence', ['asc', 'desc'])] }, { 'filters': [('active', ['=='])], 'orders': [('sequence', ['asc', 'desc'])] }, { 'filters': [('role', ['==', '!='])], 'orders': [('sequence', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('name', ['==', '!='])], 'orders': [('sequence', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('role', ['==', '!='])], 'orders': [('sequence', ['asc', 'desc'])] }] }) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities'}), Set( cfg={ 'd': { 'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more' } }) ]) ]), orm.Action(key=orm.Action.build_key('62', 'build_menu'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), WidgetBuildMenu(), Set( cfg={ 'd': { 'output.menu': '_widgets', 'output.domain': 'domain' } }) ]) ]) ] @property def _is_system(self): return self.key_id_str.startswith('system_')
class DomainRole(Role): _kind = 60 _virtual_fields = {'_records': orm.SuperRecordProperty('60')} _global_role = GlobalRole(permissions=[ orm.ActionPermission( '60', [ orm.Action.build_key('60', 'prepare'), orm.Action.build_key('60', 'create'), orm.Action.build_key('60', 'read'), orm.Action.build_key('60', 'update'), orm.Action.build_key('60', 'delete'), orm.Action.build_key('60', 'search') ], False, 'entity._original.namespace_entity._original.state != "active"'), orm.ActionPermission('60', [ orm.Action.build_key('60', 'create'), orm.Action.build_key('60', 'update'), orm.Action.build_key('60', 'delete') ], False, 'entity._is_system'), orm.FieldPermission( '60', ['name', 'active', 'permissions', '_records'], False, False, 'entity._original.namespace_entity._original.state != "active"'), orm.FieldPermission( '60', ['name', 'active', 'permissions', '_records'], False, None, 'entity._is_system') ]) _actions = [ orm.Action(key=orm.Action.build_key('60', 'prepare'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_domainrole' }}) ]) ]), orm.Action( key=orm.Action.build_key('60', 'create'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'name': orm.SuperStringProperty(required=True), 'permissions': orm.SuperMultiLocalStructuredProperty(('80', '79'), repeated=True), 'active': orm.SuperBooleanProperty(default=True) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_domainrole.name': 'input.name', '_domainrole.active': 'input.active', '_domainrole.permissions': 'input.permissions' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_domainrole' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action(key=orm.Action.build_key('60', 'read'), arguments={ 'key': orm.SuperKeyProperty(kind='60', required=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Set(cfg={'d': { 'output.entity': '_domainrole' }}) ]) ]), orm.Action( key=orm.Action.build_key('60', 'update'), arguments={ 'key': orm.SuperKeyProperty(kind='60', required=True), 'name': orm.SuperStringProperty(required=True), 'permissions': orm.SuperMultiLocalStructuredProperty(('80', '79'), repeated=True), 'active': orm.SuperBooleanProperty(default=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_domainrole.name': 'input.name', '_domainrole.active': 'input.active', '_domainrole.permissions': 'input.permissions' } }), RulePrepare(), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_domainrole' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action( key=orm.Action.build_key('60', 'delete'), arguments={'key': orm.SuperKeyProperty(kind='60', required=True)}, _plugin_groups=[ orm.PluginGroup( plugins=[Context( ), Read(), RulePrepare(), RuleExec()]), orm.PluginGroup( transactional=True, plugins=[ Delete(), Set(cfg={'d': { 'output.entity': '_domainrole' }}), CallbackNotify(), CallbackExec() ]) ]), orm.Action(key=orm.Action.build_key('60', 'search'), arguments={ 'domain': orm.SuperKeyProperty(kind='6', required=True), 'search': orm.SuperSearchProperty( default={ 'filters': [], 'orders': [{ 'field': 'name', 'operator': 'asc' }] }, cfg={ 'search_by_keys': True, 'search_arguments': { 'kind': '60', 'options': { 'limit': settings.SEARCH_PAGE } }, 'filters': { 'name': orm.SuperStringProperty(), 'active': orm.SuperBooleanProperty() }, 'indexes': [{ 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('name', ['==', '!='])], 'orders': [('name', ['asc', 'desc'])] }] }) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities'}), Set( cfg={ 'd': { 'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more' } }) ]) ]) ] @property def _is_system(self): return self.key_id_str.startswith('system_')
class Unit(orm.BaseExpando): _kind = 19 _use_record_engine = False _use_cache = True _use_memcache = True measurement = orm.SuperStringProperty( '1', required=True ) # By definition, once a unit is created, measurement can not be modified! @todo We can implement choices=['Currency', 'Mass'...], or we can use query projections for data presentation from this property! Shall we incorporate measurement value into key_id? name = orm.SuperStringProperty('2', required=True) symbol = orm.SuperStringProperty('3', required=True, indexed=False) rate = orm.SuperDecimalProperty( '4', indexed=False ) # The coefficient for the formula: 1 (base unit) = coef (this unit) - digits=(12, 12). factor = orm.SuperDecimalProperty( '5', indexed=False ) # The coefficient for the formula: coef (base unit) = 1 (this unit) - digits=(12, 12). rounding = orm.SuperDecimalProperty( '6', indexed=False) # Rounding Precision - digits=(12, 12). digits = orm.SuperIntegerProperty('7', indexed=False) active = orm.SuperBooleanProperty('8', required=True, default=True) _default_indexed = False _expando_fields = { 'code': orm.SuperStringProperty('9'), 'numeric_code': orm.SuperStringProperty('10'), 'grouping': orm.SuperIntegerProperty('11', repeated=True), 'decimal_separator': orm.SuperStringProperty('12'), 'thousands_separator': orm.SuperStringProperty('13'), 'positive_sign_position': orm.SuperIntegerProperty('14'), 'negative_sign_position': orm.SuperIntegerProperty('15'), 'positive_sign': orm.SuperStringProperty('16'), 'negative_sign': orm.SuperStringProperty('17'), 'positive_currency_symbol_precedes': orm.SuperBooleanProperty('18', default=True), 'negative_currency_symbol_precedes': orm.SuperBooleanProperty('19', default=True), 'positive_separate_by_space': orm.SuperBooleanProperty('20', default=True), 'negative_separate_by_space': orm.SuperBooleanProperty('21', default=True) } _global_role = GlobalRole(permissions=[ orm.ActionPermission('19', [ orm.Action.build_key('19', 'update_currency'), orm.Action.build_key('19', 'update_unit') ], True, 'user._root_admin or user._is_taskqueue'), orm.ActionPermission('19', [orm.Action.build_key('19', 'search')], True, 'not user._is_guest'), orm.FieldPermission('19', [ 'measurement', 'name', 'symbol', 'rate', 'factor', 'rounding', 'digits', 'active', 'code', 'numeric_code', 'grouping', 'decimal_separator', 'thousands_separator', 'positive_sign_position', 'negative_sign_position', 'positive_sign', 'positive_currency_symbol_precedes', 'negative_currency_symbol_precedes', 'positive_separate_by_space', 'negative_separate_by_space' ], False, True, 'True'), orm.FieldPermission('19', [ 'measurement', 'name', 'symbol', 'rate', 'factor', 'rounding', 'digits', 'active', 'code', 'numeric_code', 'grouping', 'decimal_separator', 'thousands_separator', 'positive_sign_position', 'negative_sign_position', 'positive_sign', 'positive_currency_symbol_precedes', 'negative_currency_symbol_precedes', 'positive_separate_by_space', 'negative_separate_by_space' ], True, True, 'user._root_admin or user._is_taskqueue') ]) _actions = [ orm.Action(key=orm.Action.build_key('19', 'update_currency'), arguments={}, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), UnitCurrencyUpdateWrite( cfg={'file': settings.CURRENCY_DATA_FILE}) ]) ]), orm.Action( key=orm.Action.build_key('19', 'update_unit'), arguments={}, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), UnitUpdateWrite(cfg={'file': settings.UOM_DATA_FILE}) ]) ]), orm.Action( key=orm.Action.build_key('19', 'search'), arguments={ 'search': orm.SuperSearchProperty( default={ 'filters': [{ 'field': 'active', 'value': True, 'operator': '==' }], 'orders': [{ 'field': 'name', 'operator': 'asc' }] }, cfg={ 'search_by_keys': True, 'search_arguments': { 'kind': '19', 'options': { 'limit': 1000 } }, 'filters': { 'measurement': orm.SuperStringProperty(), 'active': orm.SuperBooleanProperty(choices=[True]) }, 'indexes': [{ 'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])] }, { 'filters': [('active', ['==']), ('measurement', ['=='])], 'orders': [('name', ['asc', 'desc'])] }] }) }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), Search(), UnitRemoveCurrencies( ), # @todo This will be probably be removed!! RulePrepare(cfg={ 'path': '_entities', 'skip_user_roles': True }), Set( cfg={ 'd': { 'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more' } }) ]) ]) ] # @todo Do we make this a property named _uom or something similar ? def get_uom(self): '''This is because using unit_key.get() does not guarantee fresh new instance of unit that can be referenced as a entity, thats why we always create new instance of UOM. ''' new_uom = UOM() uom_fields = UOM.get_fields() for field_key, field in uom_fields.iteritems(): setattr(new_uom, field_key, getattr(self, field_key)) return new_uom
class Country(orm.BaseModel): _kind = 15 _use_record_engine = False _use_cache = True _use_memcache = True code = orm.SuperStringProperty('1', required=True, indexed=False) name = orm.SuperStringProperty('2', required=True) active = orm.SuperBooleanProperty('3', required=True, default=True) _global_role = GlobalRole( permissions=[ orm.ActionPermission('15', [orm.Action.build_key('15', 'update')], True, 'user._root_admin or user._is_taskqueue'), orm.ActionPermission('15', [orm.Action.build_key('15', 'search')], True, 'not user._is_guest'), orm.FieldPermission('15', ['code', 'name', 'active'], False, True, 'True'), orm.FieldPermission('15', ['code', 'name', 'active'], True, True, 'user._root_admin or user._is_taskqueue') ] ) _actions = [ orm.Action( key=orm.Action.build_key('15', 'update'), arguments={}, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), CountryUpdateWrite(cfg={'file': settings.LOCATION_DATA_FILE, 'prod_env': settings.DEVELOPMENT_SERVER}) ] ) ] ), orm.Action( key=orm.Action.build_key('15', 'search'), arguments={ 'search': orm.SuperSearchProperty( default={'filters': [{'field': 'active', 'value': True, 'operator': '=='}], 'orders': [{'field': 'name', 'operator': 'asc'}]}, cfg={ 'search_by_keys': True, 'search_arguments': {'kind': '15', 'options': {'limit': 1000}}, 'filters': {'active': orm.SuperBooleanProperty(choices=[True])}, 'indexes': [{'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])]}] } ) }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities', 'skip_user_roles': True}), Set(cfg={'d': {'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more'}}) ] ) ] ) ]
class CountrySubdivision(orm.BaseModel): _kind = 16 _use_record_engine = False _use_cache = True _use_memcache = True parent_record = orm.SuperKeyProperty('1', kind='16', indexed=False) code = orm.SuperStringProperty('2', required=True, indexed=False) name = orm.SuperStringProperty('3', required=True) complete_name = orm.SuperTextProperty('4', required=True) type = orm.SuperStringProperty('5', required=True, indexed=False) active = orm.SuperBooleanProperty('6', required=True, default=True) _global_role = GlobalRole( permissions=[ orm.ActionPermission('16', [orm.Action.build_key('16', 'search')], True, 'not user._is_guest'), orm.FieldPermission('16', ['parent_record', 'code', 'name', 'complete_name', 'type', 'active'], False, True, 'True'), orm.FieldPermission('16', ['parent_record', 'code', 'name', 'complete_name', 'type', 'active'], True, True, 'user._root_admin or user._is_taskqueue') ] ) _actions = [ orm.Action( key=orm.Action.build_key('16', 'search'), arguments={ 'search': orm.SuperSearchProperty( default={'filters': [{'field': 'active', 'value': True, 'operator': '=='}], 'orders': [{'field': 'name', 'operator': 'asc'}]}, cfg={ 'ancestor_kind': '15', 'search_by_keys': True, 'search_arguments': {'kind': '16', 'options': {'limit': settings.SEARCH_PAGE}}, 'filters': {'name': orm.SuperStringProperty(value_filters=[lambda p, s: s.capitalize()]), 'active': orm.SuperBooleanProperty(choices=[True])}, 'indexes': [{'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])]}, {'ancestor': True, 'filters': [('active', ['=='])], 'orders': [('name', ['asc', 'desc'])]}, {'filters': [('active', ['==']), ('name', ['==', '!=', 'contains'])], 'orders': [('name', ['asc', 'desc'])]}, {'ancestor': True, 'filters': [('active', ['==']), ('name', ['==', '!=', 'contains'])], 'orders': [('name', ['asc', 'desc'])]}] } ) }, _plugin_groups=[ orm.PluginGroup( plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), Search(), RulePrepare(cfg={'path': '_entities', 'skip_user_roles': True}), Set(cfg={'d': {'output.entities': '_entities', 'output.cursor': '_cursor', 'output.more': '_more'}}) ] ) ] ) ]
class Collection(orm.BaseModel): _kind = 10 notify = orm.SuperBooleanProperty('1', required=True, default=False) domains = orm.SuperKeyProperty('2', kind='6', repeated=True) _virtual_fields = { '_records': orm.SuperRecordProperty('10'), '_domains': orm.SuperReferenceStructuredProperty( '6', autoload=False, callback=lambda self: orm.get_multi_async( [domain_key for domain_key in self.domains]), format_callback=lambda self, entities: orm.get_async_results( entities)) } _global_role = GlobalRole(permissions=[ orm.ActionPermission( '10', [ orm.Action.build_key('10', 'update'), orm.Action.build_key('10', 'read') ], True, 'entity._original.key_parent == user.key and not user._is_guest'), orm.FieldPermission( '10', [ 'notify', 'domains', '_records', '_domains.name', '_domains.logo' ], True, True, 'entity._original.key_parent == user.key and not user._is_guest') ]) _actions = [ orm.Action(key=orm.Action.build_key('10', 'update'), arguments={ 'user': orm.SuperKeyProperty(kind='0', required=True), 'notify': orm.SuperBooleanProperty(default=True), 'domains': orm.SuperKeyProperty(kind='6', repeated=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), Set( cfg={ 'd': { '_collection.notify': 'input.notify', '_collection.domains': 'input.domains' } }), RulePrepare(cfg={'skip_user_roles': True}), RuleExec() ]), orm.PluginGroup( transactional=True, plugins=[ Write(), Set(cfg={'d': { 'output.entity': '_collection' }}) ]) ]), orm.Action(key=orm.Action.build_key('10', 'read'), arguments={ 'user': orm.SuperKeyProperty(kind='0', required=True), 'read_arguments': orm.SuperJsonProperty() }, _plugin_groups=[ orm.PluginGroup(plugins=[ Context(), Read(), RulePrepare(cfg={'skip_user_roles': True}), RuleExec(), Set(cfg={'d': { 'output.entity': '_collection' }}) ]) ]) ] @classmethod def prepare_key(cls, input, **kwargs): user_key = input.get('user') return cls.build_key(user_key._id_str, parent=user_key)