# -*- coding: utf-8 -*- #!/usr/bin/env python """ web.management.models ~~~~~~~~~ """ import logging import datetime from mongoengine import StringField, IntField, DateTimeField, DictField, BooleanField, ListField, DynamicDocument from django.conf import settings from apps.web.core.db import Searchable from apps.web.common.models import UserSearchable from apps.web.constant import Const, DEVICE_INCOME_STRATEGY logger = logging.getLogger('management.models') class DeviceMigrationHistory(Searchable): from_device = StringField(verbose_name="被迁移设备logicalCode") to_device = StringField(verbose_name="迁移目标设备logicalCode") from_device_raw = StringField(verbose_name="被迁移设备元数据 bson") to_device_raw = StringField(verbose_name="迁移目标设备元数据 bson") dateTimeAdded = DateTimeField(default=datetime.datetime.now, verbose_name='生成时间') meta = {'collection': 'device_migration_histories', 'db_alias': 'logdata'} class DeviceReplacement(Searchable): oldLogicalCode = StringField(verbose_name="旧设备编号") newLogicalCode = StringField(verbose_name="新设备编号") oldDevice = DictField() newDevice = DictField() revokedTime = DateTimeField() created = DateTimeField(default=datetime.datetime.now) replaceType = StringField(default = 'replace') search_fields = ('oldLogicalCode', 'newLogicalCode') meta = { 'collection': 'device_replacements', 'db_alias': 'logdata', 'ordering': ['-created'] } def __repr__(self): return '' % (self.oldLogicalCode, self.newLogicalCode) def set_revoke_time(self): return self.update(revokedTime=datetime.datetime.now()) def to_dict(self): return { 'id': str(self.id), 'oldLogicalCode': self.oldLogicalCode, 'newLogicalCode': self.newLogicalCode, 'createdTime': self.created } class ManagerUpScoreRecord(Searchable): dealerTel = StringField(verbose_name='经销商电话') devNo = StringField(verbose_name='设备号') devTypeName = StringField(verbose_name='设备类型') logicalCode = StringField(verbose_name='逻辑编码') coins = IntField(verbose_name="上分数量", default=0) dealerName = StringField(verbose_name='经销商的名字') address = StringField(verbose_name='设备所在的地址') managerId = StringField(verbose_name='管理人员ID') groupName = StringField(verbose_name = "组名称", default = "") createdTime = DateTimeField(default=datetime.datetime.now, verbose_name='生成时间') meta = {'collection': 'manager_up_score_records', 'db_alias': 'logdata'} def to_dict(self): return { 'dealerTel': self.dealerTel, 'devNo': self.devNo, 'devTypeName': self.devTypeName, 'logicalCode': self.logicalCode, 'coins': self.coins, 'dealerName': self.dealerName, 'address': self.address, 'managerId': self.managerId, 'groupName': self.groupName, 'createdTime': self.createdTime } class Manager(UserSearchable): DEFAULT_CONFIG = {'adSwitch': False} domain = StringField(verbose_name = '所属域名', default = settings.MY_DOMAIN) # : 定制后台展现 brandName = StringField(verbose_name = "管理后台名称", default = "") logo = StringField(verbose_name = "管理后台logo路径", default = "") #: 具备支配属性,旗下代理商和经销商都将 configs = DictField(verbose_name="厂商自主定向配置", default = DEFAULT_CONFIG) #: 主代理商的ID。每个厂家必须要有一个主代理商 primeAgentId = StringField(verbose_name="主代理商的ID", default="") adShow = BooleanField(verbose_name=u'是否参与广告', default=True) features = ListField(verbose_name=u'支持的特性', default=[]) expressAddr = DictField(verbose_name=u'邮递收件地址', default={}) deviceIncomeType = IntField(verbose_name="代理商参与设备分成的策略", default=DEVICE_INCOME_STRATEGY.AGENT_FIRST_LEDGER) meta = { 'indexes': [ { 'fields': ['username', 'domain'], 'unique': True } ], 'collection': 'Manager', 'db_alias': 'default' } search_fields = ('username', 'nickname', 'remarks', 'brandName') @classmethod def create_or_get(cls, username, password, **attrs): manager = cls.objects(username = username, domain = settings.MY_DOMAIN).first() if manager: return manager else: return cls.create_user(username, password, **attrs) def set_configs(self, configs): self.configs.update(configs) return self.save() def to_dict(self, shadow = False): rv = super(Manager, self).to_dict(shadow = shadow) rv.update({ 'id': str(self.id), 'adShow': self.adShow, 'domain': self.domain, 'logo': self.logo, 'brandName': self.brandName, 'featureList': self.feature_list, 'exchangeAddress':self.expressAddr }) return rv @staticmethod def get_factory_addr(managerId): obj = Manager.objects.get(id = managerId) if obj.expressAddr and obj.expressAddr.has_key('name') and obj.expressAddr.has_key('addr') and obj.expressAddr.has_Key('tel'): return obj.expressAddr else: return {'name':Const.DEFAULT_NAME,'addr':Const.DEFAULT_ADDR,'tel':Const.DEFAULT_TELNO} @property def deviceIncomeShow(self): """ 特性控制是否显示 """ return "deviceIncomeShow" in self.features class ManagementArchive(Searchable): """ 管理档案 """ reason = StringField() title = StringField() content = StringField() meta = {'collection': 'management_archive', 'db_alias': 'default'} class DummyManagerData(DynamicDocument): managerId = StringField(verbose_name = u'managerid') dataKey = StringField(verbose_name = u'数据键') value = DictField(verbose_name = u'假数据') meta = {'collection': 'dummy_manager_data', 'db_alias': 'default'}