From 9c68c22f48fa991166ccecc04c5eeace899113b3 Mon Sep 17 00:00:00 2001 From: 007 <007gzs@gmail.com> Date: Tue, 15 May 2018 15:55:52 +0800 Subject: [PATCH 01/65] =?UTF-8?q?=E6=94=AF=E6=8C=81django=202,=20python=20?= =?UTF-8?q?3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/admin.py | 6 ++-- basedata/models.py | 72 +++++++++++++++++++++---------------------- basedata/views.py | 2 +- common/const.py | 2 +- common/generic.py | 29 +++++++++--------- hr/models.py | 14 ++++----- invent/admin.py | 5 ++- invent/models.py | 75 ++++++++++++++++++++++----------------------- invent/views.py | 10 +++--- midware/cuser.py | 18 ++++++++--- mis/production.py | 11 +++---- mis/settings.py | 4 +-- mis/urls.py | 2 +- organ/models.py | 10 +++--- plugin/wfactions.py | 5 +-- plugin/xls.py | 18 +++++------ purchase/models.py | 32 +++++++++---------- sale/models.py | 38 +++++++++++------------ selfhelp/admin.py | 4 +-- selfhelp/models.py | 54 ++++++++++++++++---------------- selfhelp/views.py | 2 +- syscfg/models.py | 6 ++-- workflow/admin.py | 2 +- workflow/models.py | 31 +++++++++---------- workflow/views.py | 8 ++--- 25 files changed, 231 insertions(+), 229 deletions(-) diff --git a/basedata/admin.py b/basedata/admin.py index 7a0cd81..48ec3d5 100644 --- a/basedata/admin.py +++ b/basedata/admin.py @@ -85,7 +85,7 @@ def get_queryset(self, request): elif request.user.has_perm('basedata.view_all_customer'): return super(PartnerAdmin,self).get_queryset(request).filter(partner_type='C') else: - return super(PartnerAdmin,self).get_queryset(request).filter(partner_type='S') + return super(PartnerAdmin,self).get_queryset(request).filter(partner_type='S') class ProjectForm(models.ModelForm): @@ -125,7 +125,7 @@ def save_model(self, request, obj, form, change): if not code: obj.code = '%s%02d' % ('A',obj.id) obj.save() - except Exception,e: + except Exception as e: self.message_user(request,'ERROR:%s' % e,level=messages.ERROR) @@ -153,7 +153,7 @@ def save_model(self, request, obj, form, change): else: obj.path = obj.parent.name obj.save() - except Exception,e: + except Exception as e: self.message_user(request,'ERROR:%s' % e,level=messages.ERROR) diff --git a/basedata/models.py b/basedata/models.py index 68f77f6..7bd4989 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -4,7 +4,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey from django.utils.translation import ugettext_lazy as _ -from django.utils.text import force_text +from django.utils.encoding import force_text from common import const from common import generic from syscfg.models import Module,Site @@ -20,11 +20,11 @@ class ValueList(generic.BO): index_weight = 9 code = models.CharField(_("list code"),max_length=const.DB_CHAR_CODE_6,blank=True,null=True) name = models.CharField(_("list name"),max_length=const.DB_CHAR_NAME_40) - module = models.ForeignKey(Module,verbose_name=_("module"),blank=True,null=True) + module = models.ForeignKey(Module,verbose_name=_("module"),blank=True,null=True,on_delete=models.CASCADE) status = models.BooleanField(_("in use"),default=True) init = models.BooleanField(_("is init"),default=False) locked = models.BooleanField(_("is locked"),default=False) - locked_by = models.ForeignKey(User,verbose_name=_("locked by"),blank=True,null=True) + locked_by = models.ForeignKey(User,verbose_name=_("locked by"),blank=True,null=True,on_delete=models.CASCADE) lock_time = models.DateTimeField(_("locked time"),null=True,blank=True) def save(self, force_insert=False, force_update=False, using=None, @@ -43,7 +43,7 @@ class ValueListItem(models.Model): """ 值列表项 """ - group = models.ForeignKey(ValueList,verbose_name=_("list group")) + group = models.ForeignKey(ValueList,verbose_name=_("list group"),on_delete=models.CASCADE) group_code = models.CharField(max_length=const.DB_CHAR_CODE_6,blank=True,null=True) code = models.CharField(_("item code"),max_length=const.DB_CHAR_CODE_6,blank=True,null=True) name = models.CharField(_("item name"),max_length=const.DB_CHAR_NAME_40) @@ -91,7 +91,7 @@ class Address(generic.BO): phone = models.CharField(_("phone"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) contacts = models.CharField(_("contacts"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True) - content_type = models.ForeignKey(ContentType,blank=True,null=True) + content_type = models.ForeignKey(ContentType,blank=True,null=True,on_delete=models.CASCADE) object_id = models.PositiveIntegerField(blank=True,null=True) content_object = GenericForeignKey('content_type', 'object_id') @@ -116,7 +116,7 @@ class Partner(generic.BO): ('C','C'), ('D','D'), ) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) code = models.CharField(_("partner code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) name = models.CharField(_("partner name"),max_length=const.DB_CHAR_NAME_120) short = models.CharField(_("short name"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) @@ -148,8 +148,8 @@ class BankAccount(generic.BO): account = models.CharField(_("account num"),max_length=const.DB_CHAR_NAME_40) title = models.CharField(_("bank name"),max_length=const.DB_CHAR_NAME_40) memo = models.CharField(_("memo"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True,on_delete=models.CASCADE) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) def __unicode__(self): name = '' @@ -177,7 +177,7 @@ class Project(generic.BO): short = models.CharField(_("short name"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) pinyin = models.CharField(_("pinyin"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) - partner = models.ForeignKey(Partner,blank=True,null=True,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"}) + partner = models.ForeignKey(Partner,blank=True,null=True,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"},on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,default='00',choices=STATUS) prj_type = models.CharField(_("project type"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=TYPES,default='00') @@ -192,7 +192,7 @@ class Project(generic.BO): business = models.FileField(_("business document"),upload_to='project',blank=True,null=True) users = models.ManyToManyField(User,verbose_name=_("related users"),blank=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) class Meta: verbose_name = _('project') @@ -209,7 +209,7 @@ class Warehouse(models.Model): status = models.BooleanField(_("in use"),default=True) location = models.CharField(_("location"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) users = models.ManyToManyField(User,verbose_name=_("related users"),blank=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) def __unicode__(self): return '%s' % self.name @@ -244,7 +244,7 @@ class Trade(models.Model): code = models.CharField(_("code"),max_length=const.DB_CHAR_CODE_6) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_120) memo = models.CharField(_("memo"),max_length=const.DB_CHAR_NAME_120,null=True,blank=True) - parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) + parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True,on_delete=models.CASCADE) def __unicode__(self): return '%s' % self.name @@ -260,7 +260,7 @@ class Brand(models.Model): 品牌 """ index_weight = 101 - trade = models.ForeignKey(Trade,verbose_name=_("trade"),null=True,blank=True) + trade = models.ForeignKey(Trade,verbose_name=_("trade"),null=True,blank=True,on_delete=models.CASCADE) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_120) pinyin = models.CharField(_("pinyin"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) weight = models.IntegerField(_("weight"),blank=True,null=True,default=99) @@ -278,8 +278,8 @@ class Category(models.Model): 分类 """ index_weight = 100 - trade = models.ForeignKey(Trade,verbose_name=_("trade"),null=True,blank=True) - parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) + trade = models.ForeignKey(Trade,verbose_name=_("trade"),null=True,blank=True,on_delete=models.CASCADE) + parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True,on_delete=models.CASCADE) code = models.CharField(_("code"),max_length=const.DB_CHAR_CODE_6,null=True,blank=True) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_120) path = models.CharField(_("path"),max_length=const.DB_CHAR_NAME_200,null=True,blank=True) @@ -297,7 +297,7 @@ class TechnicalParameterName(models.Model): 技术参数-名称,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ index_weight = 7 - category = models.ForeignKey(Category,verbose_name=_("material category")) + category = models.ForeignKey(Category,verbose_name=_("material category"),on_delete=models.CASCADE) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_40) status = models.BooleanField(_("in use"),default=True) @@ -313,7 +313,7 @@ class TechnicalParameterValue(models.Model): """ 技术参数-值,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ - tech_name = models.ForeignKey(TechnicalParameterName,verbose_name=_("technical name")) + tech_name = models.ForeignKey(TechnicalParameterName,verbose_name=_("technical name"),on_delete=models.CASCADE) value = models.CharField(_("value"),max_length=const.DB_CHAR_NAME_80) description = models.CharField(_("description"),max_length=const.DB_CHAR_NAME_80,null=True,blank=True) @@ -335,15 +335,15 @@ class Material(generic.BO): name = models.CharField(_("material name"),max_length=const.DB_CHAR_NAME_120) spec = models.CharField(_("specifications"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) pinyin = models.CharField(_("pinyin"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) - brand = models.ForeignKey(Brand,blank=True,null=True,verbose_name=_("brand")) - category = models.ForeignKey(Category,blank=True,null=True,verbose_name=_("category")) + brand = models.ForeignKey(Brand,blank=True,null=True,verbose_name=_("brand"),on_delete=models.CASCADE) + category = models.ForeignKey(Category,blank=True,null=True,verbose_name=_("category"),on_delete=models.CASCADE) tp = models.CharField(_('mt type'),blank=True,null=True,max_length=const.DB_CHAR_CODE_2,choices=const.get_value_list('S054'),default='10') status = models.BooleanField(_("in use"),default=True) is_equip = models.BooleanField(_("is equipment"),default=False) can_sale = models.BooleanField(_("can sale"),default=True) is_virtual = models.BooleanField(_("is virtual"),default=False) - warehouse = models.ForeignKey(Warehouse,blank=True,null=True,verbose_name=_("warehouse")) + warehouse = models.ForeignKey(Warehouse,blank=True,null=True,verbose_name=_("warehouse"),on_delete=models.CASCADE) measure = models.ManyToManyField(Measure,verbose_name=_("measure")) params = models.ManyToManyField(TechnicalParameterValue,verbose_name=_("technical parameter"),through='MaterialParam') @@ -351,7 +351,7 @@ class Material(generic.BO): stock_price = models.DecimalField(_("stock price"),max_digits=14,decimal_places=4,blank=True,null=True) purchase_price = models.DecimalField(_("purchase price"),max_digits=14,decimal_places=4,blank=True,null=True) sale_price = models.DecimalField(_("sale price"),max_digits=14,decimal_places=4,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) def __unicode__(self): @@ -367,9 +367,9 @@ class MaterialParam(models.Model): """ """ - material = models.ForeignKey(Material) - param_value = models.ForeignKey(TechnicalParameterValue) - param_name = models.ForeignKey(TechnicalParameterName,blank=Trade,null=True) + material = models.ForeignKey(Material,on_delete=models.CASCADE) + param_value = models.ForeignKey(TechnicalParameterValue,on_delete=models.CASCADE) + param_name = models.ForeignKey(TechnicalParameterName,blank=Trade,null=True,on_delete=models.CASCADE) creation = models.DateField(auto_now_add=True) def __unicode__(self): @@ -389,7 +389,7 @@ class ExtraParam(models.Model): ('NUM',_('NUMBER')), ('DATE',_('DATE')), ) - material = models.ForeignKey(Material,verbose_name=_("material")) + material = models.ForeignKey(Material,verbose_name=_("material"),on_delete=models.CASCADE) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_40) data_type = models.CharField(_("data type"),default='CHAR',choices=DATA_TYPE,max_length=const.DB_CHAR_CODE_6) data_source = models.CharField(_("data source"),blank=True,null=True,max_length=const.DB_CHAR_NAME_40) @@ -419,9 +419,9 @@ class ExpenseAccount(generic.BO): name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_120) category = models.CharField(_("category"),max_length=const.DB_CHAR_CODE_4,choices=CATEGORY,default='PU') description = models.TextField(_("description"),blank=True,null=True) - parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) + parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True,on_delete=models.CASCADE) status = models.BooleanField(_("in use"),default=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) class Meta: verbose_name = _('expenses account') @@ -436,7 +436,7 @@ class Employee(generic.BO): index_weight = 2 code = models.CharField(_("employee number"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) phone = models.CharField(_("phone"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - organization = models.ForeignKey(Organization,verbose_name = _('organization'),null=True,blank=True) + organization = models.ForeignKey(Organization,verbose_name = _('organization'),null=True,blank=True,on_delete=models.CASCADE) name = models.CharField(_("employee name"),max_length=const.DB_CHAR_NAME_120) pinyin = models.CharField(_("pinyin"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) birthday = models.DateField(_("birthday"),blank=True,null=True) @@ -453,7 +453,7 @@ class Employee(generic.BO): email = models.CharField(_("email"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) office = models.CharField(_("office phone"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - position = models.ForeignKey(Position,verbose_name = _('position')) + position = models.ForeignKey(Position,verbose_name = _('position'),on_delete=models.CASCADE) rank = models.CharField(_("employee rank"),max_length=const.DB_CHAR_CODE_2,default='00',choices=const.get_value_list('S017')) workday = models.DateField(_("workday"),blank=True,null=True) @@ -481,7 +481,7 @@ class Employee(generic.BO): tag3 = models.CharField(_("tag3 dsjs"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S041'),default='00') tag4 = models.CharField(_("tag4 byzk"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S027'),default='0') - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) def age(self): import datetime @@ -520,7 +520,7 @@ class Family(generic.BO): organization = models.CharField(_("organization"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) phone = models.CharField(_("phone"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) emergency = models.BooleanField(_("emergency"),default=False) - employee = models.ForeignKey(Employee,verbose_name=_("employee")) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),on_delete=models.CASCADE) class Meta: verbose_name = _("family member") @@ -535,7 +535,7 @@ class Education(generic.BO): school = models.CharField(_("school"),max_length=const.DB_CHAR_NAME_120) major = models.CharField(_("major"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) degree = models.CharField(_("major degree"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S037'),default='4') - employee = models.ForeignKey(Employee,verbose_name=_("employee")) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),on_delete=models.CASCADE) class Meta: verbose_name = _("education experience") @@ -548,7 +548,7 @@ class WorkExperience(generic.BO): """ organization = models.CharField(_("organization"),max_length=const.DB_CHAR_NAME_120) position = models.CharField(_("position"),max_length=const.DB_CHAR_NAME_120) - employee = models.ForeignKey(Employee,verbose_name=_("employee")) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),on_delete=models.CASCADE) class Meta: verbose_name = _("work experience") @@ -569,7 +569,7 @@ class DataImport(generic.BO): imp_date = models.DateField(_('date'),blank=True,null=True,default=datetime.datetime.today) title = models.CharField(_('title'),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_('description'),blank=True,null=True) - content_type = models.ForeignKey(ContentType,verbose_name=_("content type"),limit_choices_to={"app_label__in":['basedata','organ','auth']}) + content_type = models.ForeignKey(ContentType,verbose_name=_("content type"),limit_choices_to={"app_label__in":['basedata','organ','auth']},on_delete=models.CASCADE) attach = models.FileField(_('attach'),blank=True,null=True,upload_to='data') is_clear = models.BooleanField(_('clear old data?'),default=0) handler = models.CharField(_('handler class'),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) @@ -615,7 +615,7 @@ def action_import(self,request): # print 'name is %s value is %s'%(name,v) try: params.pop('') - except Exception,e: + except Exception: pass # print params klass.objects.create(**params) @@ -646,7 +646,7 @@ class Document(generic.BO): description = models.TextField(_('description'),blank=True,null=True) tp = models.CharField(_('type'),max_length=const.DB_CHAR_CODE_2,default='10',choices=TP) business_domain = models.CharField(_("business domain"),max_length=const.DB_CHAR_CODE_4,choices=const.get_value_list('S045'),default='OT') - user = models.ForeignKey(User,verbose_name=_('user'),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_('user'),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_('status'),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) pub_date = models.DateTimeField(_('publish date'),blank=True,null=True) size = models.CharField(_('size'),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) diff --git a/basedata/views.py b/basedata/views.py index 744b316..80acbbe 100644 --- a/basedata/views.py +++ b/basedata/views.py @@ -25,7 +25,7 @@ def action_import(request,object_id): try: messages.success(request,_('data import successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/basedata/dataimport/%s"%(object_id)) diff --git a/common/const.py b/common/const.py index cb30663..a1b11d3 100644 --- a/common/const.py +++ b/common/const.py @@ -33,7 +33,7 @@ def get_value_list(group): cursor.execute('SELECT code,name FROM basedata_valuelistitem WHERE group_code=%s AND status=1',[group]) rows = cursor.fetchall() return tuple([(code,name) for code,name in rows]) - except Exception,e: + except Exception as e: return None else: return None diff --git a/common/generic.py b/common/generic.py index 50a4e03..330b7c3 100644 --- a/common/generic.py +++ b/common/generic.py @@ -1,4 +1,6 @@ # coding=utf-8 +import logging + __author__ = 'zhugl' # created at 15-4-21 import datetime @@ -9,10 +11,9 @@ from django.db.models import fields from django.db.models.fields import related from django.contrib import admin -from django.http import HttpRequest,HttpResponseRedirect,HttpResponse +from django.http import HttpRequest,HttpResponse from django.contrib.contenttypes.models import ContentType -from django.utils.text import force_text -from django.utils.encoding import smart_str +from django.utils.encoding import smart_str, force_text from django.utils.http import urlquote from django.utils.translation import ugettext_lazy as _ from common import const @@ -32,8 +33,8 @@ def update(sql, params=None): cursor.execute(sql,params) else: cursor.execute(sql) - except Exception,e: - print e + except Exception as e: + logging.error('', exc_info=e) def get_app_model_info_from_request(request): """ @@ -148,8 +149,8 @@ def changeform_view(self, request, object_id=None, form_url='', extra_context=No can_restart = True show_workflow_line = True - except Exception,e: - print Exception,e + except Exception: + pass if workflow_modal and not workflow_instance: show_submit_button = True @@ -209,8 +210,7 @@ def history_view(self, request, object_id, extra_context=None): ) # print history_list extra_context.update(ctx) - except Exception,e: - print Exception,e + except Exception: pass return super(BOAdmin,self).history_view(request,object_id,extra_context) @@ -228,7 +228,7 @@ def save_model(self, request, obj, form, change): setattr(obj,'end',datetime.date(9999,12,31)) try: setattr(obj,'user',request.user) - except Exception,e: + except Exception: pass super(BOAdmin,self).save_model(request,obj,form,change) @@ -241,10 +241,9 @@ def save_model(self, request, obj, form, change): code = fmt % (self.CODE_PREFIX,obj.id) table = obj._meta.db_table sql = 'update %s set code = \'%s\' where id=%s' % (table,code,obj.id) - print sql update(sql) - except Exception,e: - print e + except Exception: + pass # def response_change(self, request, obj): # return HttpResponseRedirect('') @@ -263,7 +262,7 @@ def export_selected_data(self,request,queryset): try: f = ops.get_field(field) col_name = f.verbose_name - except Exception,e: + except Exception: f = getattr(self.model,field) if hasattr(f,'short_description'): col_name = f.short_description @@ -276,7 +275,7 @@ def export_selected_data(self,request,queryset): f = field try: f = ops.get_field(field) - except Exception,e: + except Exception: pass v = getattr(obj,field,'') if hasattr(v,'__call__') or callable(v): diff --git a/hr/models.py b/hr/models.py index 3582a05..9c81d73 100644 --- a/hr/models.py +++ b/hr/models.py @@ -62,8 +62,8 @@ class Entry(generic.BO): zipcode = models.CharField(_("zipcode"),max_length=const.DB_CHAR_CODE_8) phone = models.CharField(_("phone"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - guider = models.ForeignKey(Employee,verbose_name=_("guider")) - position = models.ForeignKey(Position,verbose_name = _('designate position')) + guider = models.ForeignKey(Employee,verbose_name=_("guider"),on_delete=models.CASCADE) + position = models.ForeignKey(Position,verbose_name = _('designate position'),on_delete=models.CASCADE) rank = models.CharField(_("employee rank"),max_length=const.DB_CHAR_CODE_2,default='00',choices=const.get_value_list('S017')) ygxs = models.CharField(_("employ ygxs"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S019'),default='2') category = models.CharField(_("employ category"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S018'),default='21') @@ -87,9 +87,9 @@ class EmployeeSalaryItem(models.Model): """ """ - entry = models.ForeignKey(Entry,verbose_name=_("employee entry")) - employee = models.ForeignKey(Employee,verbose_name=_("employee"),blank=True,null=True) - salary_item = models.ForeignKey(SalaryItem,verbose_name=_("salary item")) + entry = models.ForeignKey(Entry,verbose_name=_("employee entry"),on_delete=models.CASCADE) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),blank=True,null=True,on_delete=models.CASCADE) + salary_item = models.ForeignKey(SalaryItem,verbose_name=_("salary item"),on_delete=models.CASCADE) calculate_way = models.CharField(_("calculate way"),max_length=const.DB_CHAR_CODE_2,choices=const.get_value_list('S050'),default='10') fixed_value = models.DecimalField(_("fixed value"),blank=True,null=True,max_digits=10,decimal_places=2) base_value = models.DecimalField(_("base value"),blank=True,null=True,max_digits=10,decimal_places=2) @@ -106,7 +106,7 @@ class Transfer(generic.BO): """ 人员调动 """ - employee = models.ForeignKey(Employee,verbose_name=_("employee")) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),on_delete=models.CASCADE) class Meta: verbose_name = _("employee transfer") @@ -117,7 +117,7 @@ class Departure(generic.BO): """ 人员离职 """ - employee = models.ForeignKey(Employee,verbose_name=_("employee")) + employee = models.ForeignKey(Employee,verbose_name=_("employee"),on_delete=models.CASCADE) class Meta: verbose_name = _("employee departure") diff --git a/invent/admin.py b/invent/admin.py index 5bfbd32..e5601de 100644 --- a/invent/admin.py +++ b/invent/admin.py @@ -87,15 +87,14 @@ def save_model(self, request, obj, form, change): try: InItem.objects.get(po_item=item,master=obj) continue - except Exception,e: + except Exception as e: pp = item.discount_price or item.price if decimal.Decimal(item.tax) > decimal.Decimal(0): pp = pp /(decimal.Decimal(1)+decimal.Decimal(item.tax)) InItem.objects.create(warehouse=obj.warehouse,material=item.material,measure=item.measure,prop='+', - po_item=item,master=obj,cnt=item.left_cnt,price=pp,batch=obj.batch,source=obj.code) + po_item=item,master=obj,cnt=item.left_cnt,price=pp,batch=obj.batch,source=obj.code) def get_readonly_fields(self, request, obj=None): - print obj if obj and obj.status == 9: return ['code','title','po','warehouse','batch','status'] else: diff --git a/invent/models.py b/invent/models.py index b863956..b95d40b 100644 --- a/invent/models.py +++ b/invent/models.py @@ -3,11 +3,10 @@ import os import datetime import decimal -from django.db import transaction from django.db import models from django import forms from mis import settings -from django.utils.text import force_text +from django.utils.encoding import force_text from django.db import transaction from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ @@ -23,10 +22,10 @@ class Inventory(generic.BO): 库存信息 """ index_weight = 1 - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) - warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse")) - material = models.ForeignKey(Material,verbose_name=_("material")) - measure = models.ForeignKey(Measure,verbose_name=_("measure")) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) + warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse"),on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),on_delete=models.CASCADE) + measure = models.ForeignKey(Measure,verbose_name=_("measure"),on_delete=models.CASCADE) cnt = models.DecimalField(_("count"),max_digits=14,decimal_places=4) batch = models.CharField(_("batch"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) price = models.DecimalField(_("price"),max_digits=14,decimal_places=4) @@ -51,9 +50,9 @@ class InitialInventory(generic.BO): ) index_weight = 9 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) execute_time = models.DateTimeField(_("execute time"),blank=True,null=True) attach = models.FileField(_('attach'),blank=True,null=True,upload_to='inventory',help_text=u'参考FD0002模板文档') @@ -80,17 +79,17 @@ def save(self, force_insert=False, force_update=False, using=None, try: measure = Measure.objects.get(code=unit_code) - except Exception,e: + except Exception: measure = Measure.objects.create(code=unit_code,name=force_text(unit_name.decode('gbk'))) try: house = Warehouse.objects.get(code=warehouse_code) - except Exception,e: + except Exception: house = Warehouse.objects.create(code=warehouse_code,name=force_text(warehouse_name.decode('gbk'))) try: material = Material.objects.get(code=code) - except Exception,e: + except Exception: material = Material(code=code,name=force_text(name.decode('gbk')),spec=force_text(description.decode('gbk')),warehouse=house) material.stock_price = price material.save() @@ -138,13 +137,13 @@ class StockIn(generic.BO): ) index_weight = 3 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) - warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse")) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) + warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse"),on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) execute_time = models.DateTimeField(_("execute time"),blank=True,null=True) - po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order"),null=True,limit_choices_to={"entry_status":"0"},blank=True) + po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order"),null=True,limit_choices_to={"entry_status":"0"},blank=True,on_delete=models.CASCADE) amount = models.DecimalField(_("stock in money of amount"),max_digits=14,decimal_places=4,blank=True,null=True) batch = models.CharField(_("batch"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) @@ -183,7 +182,7 @@ def action_entry(self,request): inventory.cnt += item.cnt inventory.save() total_amount += item.price*item.cnt - except Exception,e: + except Exception: Inventory.objects.create(warehouse=self.warehouse,material=item.material,measure=item.measure, cnt=item.cnt,price=item.price,org=self.org) item.material.stock_price = item.price @@ -231,13 +230,13 @@ class StockOut(generic.BO): ) index_weight = 2 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) - project = models.ForeignKey(Project,verbose_name=_("project"),blank=True,null=True) - wo = models.ForeignKey(WorkOrder,verbose_name=_("work order"),blank=True,null=True) + project = models.ForeignKey(Project,verbose_name=_("project"),blank=True,null=True,on_delete=models.CASCADE) + wo = models.ForeignKey(WorkOrder,verbose_name=_("work order"),blank=True,null=True,on_delete=models.CASCADE) description = models.TextField(_("description"),blank=True,null=True) amount = models.DecimalField(_("money of amount"),max_digits=14,decimal_places=4,blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) execute_time = models.DateTimeField(_("execute time"),blank=True,null=True) @@ -291,11 +290,11 @@ class WareReturn(generic.BO): ) index_weight = 5 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) - out = models.ForeignKey(StockOut,verbose_name=_('StockOut')) + out = models.ForeignKey(StockOut,verbose_name=_('StockOut'),on_delete=models.CASCADE) amount = models.DecimalField(_("money of amount"),max_digits=14,decimal_places=4,blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) execute_time = models.DateTimeField(_("execute time"),blank=True,null=True) @@ -342,10 +341,10 @@ class WareAdjust(generic.BO): ) index_weight = 4 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_("description"),blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("out user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) execute_time = models.DateTimeField(_("execute time"),blank=True,null=True) @@ -384,9 +383,9 @@ class InOutDetail(models.Model): create_time = models.DateTimeField(_("create time"),auto_now_add=True) status = models.BooleanField(_("executed"),default=0) event_time = models.DateTimeField(_("event time"),blank=True,null=True) - warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse"),blank=True,null=True) - material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0"},blank=True,null=True) - measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True) + warehouse = models.ForeignKey(Warehouse,verbose_name=_("warehouse"),blank=True,null=True,on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0"},blank=True,null=True,on_delete=models.CASCADE) + measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True,on_delete=models.CASCADE) cnt = models.DecimalField(_("count"),max_digits=14,decimal_places=4,blank=True,null=True) batch = models.CharField(_("batch"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) price = models.DecimalField(_("price"),max_digits=14,decimal_places=4,blank=True,null=True) @@ -398,7 +397,7 @@ class InitItem(InOutDetail): """ 期初入库明细 """ - master = models.ForeignKey(InitialInventory) + master = models.ForeignKey(InitialInventory,on_delete=models.CASCADE) class Meta: verbose_name = _("init item") @@ -409,8 +408,8 @@ class InItem(InOutDetail): """ 入库单明细 """ - master = models.ForeignKey(StockIn) - po_item = models.ForeignKey(POItem,verbose_name=_("po item"),blank=True,null=True) + master = models.ForeignKey(StockIn,on_delete=models.CASCADE) + po_item = models.ForeignKey(POItem,verbose_name=_("po item"),blank=True,null=True,on_delete=models.CASCADE) def get_new_price(self): if self.po_item and self.master.warehouse: @@ -420,7 +419,7 @@ def get_new_price(self): total_amount = self.price*self.cnt+inventory.price*inventory.cnt total_count = self.cnt+inventory.cnt return total_amount/total_count - except Exception,e: + except Exception as e: pass return self.price or '' @@ -442,8 +441,8 @@ class OutItem(InOutDetail): """ 出库单明细 """ - master = models.ForeignKey(StockOut) - inventory = models.ForeignKey(Inventory,blank=True,null=True,verbose_name=_("inventory material")) + master = models.ForeignKey(StockOut,on_delete=models.CASCADE) + inventory = models.ForeignKey(Inventory,blank=True,null=True,verbose_name=_("inventory material"),on_delete=models.CASCADE) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -464,8 +463,8 @@ class ReturnItem(InOutDetail): """ 返库单明细 """ - master = models.ForeignKey(WareReturn) - out_item = models.ForeignKey(OutItem,blank=True,null=True,verbose_name=_('out item')) + master = models.ForeignKey(WareReturn,on_delete=models.CASCADE) + out_item = models.ForeignKey(OutItem,blank=True,null=True,verbose_name=_('out item'),on_delete=models.CASCADE) out_cnt = models.DecimalField(_("out count"),max_digits=14,decimal_places=4) class Meta: @@ -477,8 +476,8 @@ class AdjustItem(InOutDetail): """ 库存调整明细 """ - master = models.ForeignKey(WareAdjust) - inventory = models.ForeignKey(Inventory,blank=True,null=True,verbose_name=_("inventory material")) + master = models.ForeignKey(WareAdjust,on_delete=models.CASCADE) + inventory = models.ForeignKey(Inventory,blank=True,null=True,verbose_name=_("inventory material"),on_delete=models.CASCADE) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): diff --git a/invent/views.py b/invent/views.py index d747b63..79a3739 100644 --- a/invent/views.py +++ b/invent/views.py @@ -27,7 +27,7 @@ def action_in(request,object_id): try: obj.action_entry(request) messages.success(request,_('check in successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/invent/stockin/%s"%(object_id)) @@ -60,7 +60,7 @@ def action_out(request,object_id): try: obj.action_out(request) messages.success(request,_('check out successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/invent/stockout/%s"%(object_id)) @@ -92,7 +92,7 @@ def action_init(request,object_id): try: obj.init_entry(request) messages.success(request,_('check in successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/invent/initialinventory/%s"%(object_id)) @@ -125,7 +125,7 @@ def action_return(request,object_id): try: obj.action_return(request) messages.success(request,_('check in successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/invent/warereturn/%s"%(object_id)) @@ -158,7 +158,7 @@ def action_adjust(request,object_id): try: obj.action_adjust(request) messages.success(request,_('check in successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/invent/wareadjust/%s"%(object_id)) diff --git a/midware/cuser.py b/midware/cuser.py index d8989e9..e61ce70 100644 --- a/midware/cuser.py +++ b/midware/cuser.py @@ -8,7 +8,15 @@ from django.contrib.admin import ModelAdmin, actions from django.contrib.auth import REDIRECT_FIELD_NAME from django.core.exceptions import ImproperlyConfigured, PermissionDenied -from django.core.urlresolvers import NoReverseMatch, reverse + +import django +if django.VERSION > (1, 10): + from django.urls import NoReverseMatch, reverse + from django.utils.deprecation import MiddlewareMixin +else: + from django.core.urlresolvers import NoReverseMatch, reverse + class MiddlewareMixin(object): + pass from django.db.models.base import ModelBase from django.http import Http404, HttpResponseRedirect from django.template.engine import Engine @@ -26,7 +34,7 @@ def getuser(): return getattr(_thread_local,'user',None) -class RequestUser(object): +class RequestUser(MiddlewareMixin): def process_request(self,request): django_user = getattr(request,'user',None) @@ -90,7 +98,7 @@ def process_view(self, request, view_func, view_args, view_kwargs): try: todolist = self.get_my_task(request) context.update(dict(todolist = todolist)) - except Exception,e: + except Exception: pass # print context view_kwargs['extra_context'] = context @@ -110,10 +118,10 @@ def process_view(self, request, view_func, view_args, view_kwargs): 'name': apps.get_app_config(label).verbose_name, 'app_label': label, 'app_url': reverse( - 'admin:app_list', + 'admin:app_list', kwargs={'app_label': label}, current_app=admin.site.name, - ), + ), 'weight':app_weight.get(label,99), 'is_current':is_current, } diff --git a/mis/production.py b/mis/production.py index f277194..088c320 100644 --- a/mis/production.py +++ b/mis/production.py @@ -52,7 +52,6 @@ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', @@ -116,12 +115,12 @@ # https://docs.djangoproject.com/en/1.8/howto/static-files/ STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR,'static') +STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = ( - ('css',os.path.join(STATIC_ROOT,'css')), - ('js',os.path.join(STATIC_ROOT,'js')), - ('img',os.path.join(STATIC_ROOT,'img')), + ('css', os.path.join(STATIC_ROOT, 'css')), + ('js', os.path.join(STATIC_ROOT, 'js')), + ('img', os.path.join(STATIC_ROOT, 'img')), ) MEDIA_ROOT = os.path.join(BASE_DIR,'upload') -MEDIA_URL = '/upload/' \ No newline at end of file +MEDIA_URL = '/upload/' diff --git a/mis/settings.py b/mis/settings.py index 5e4b36b..63bf84f 100644 --- a/mis/settings.py +++ b/mis/settings.py @@ -52,12 +52,12 @@ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'midware.cuser.RequestUser', ) +MIDDLEWARE = MIDDLEWARE_CLASSES ROOT_URLCONF = 'mis.urls' @@ -91,7 +91,7 @@ 'HOST': 'localhost', 'NAME': 'mis', 'USER': 'root', - 'PASSWORD': 'root', + 'PASSWORD': 'admin007', } } diff --git a/mis/urls.py b/mis/urls.py index 6250797..63a1e23 100644 --- a/mis/urls.py +++ b/mis/urls.py @@ -12,7 +12,7 @@ url(r"^admin/(?P\w+)/(?P\w+)/(?P\d+)/start", workflow.views.start), url(r"^admin/(?P\w+)/(?P\w+)/(?P\d+)/approve/(?P\d+)", workflow.views.approve), url(r"^admin/(?P\w+)/(?P\w+)/(?P\d+)/restart/(?P\d+)", workflow.views.restart), - url(r'^admin/', include(admin.site.urls)), + url(r'^admin/', admin.site.urls), url(r'^admin/invent/', include(invent.urls)), url(r'^admin/basedata/', include(basedata.urls)), url(r'^admin/selfhelp/', include(selfhelp.urls)), diff --git a/organ/models.py b/organ/models.py index 95e3347..d589978 100644 --- a/organ/models.py +++ b/organ/models.py @@ -52,8 +52,8 @@ class OrgUnit(generic.BO): (5,_('COMMITTEE')) ) index_weight = 2 - parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) - organization = models.ForeignKey(Organization,verbose_name = _('organization'),null=True,blank=True) + parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True,on_delete=models.CASCADE) + organization = models.ForeignKey(Organization,verbose_name = _('organization'),null=True,blank=True,on_delete=models.CASCADE) code = models.CharField(_("code"),max_length=const.DB_CHAR_CODE_8,blank=True,null=True) name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_120) short = models.CharField(_("short name"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) @@ -91,9 +91,9 @@ class Position(generic.BO): ('05', _("EXPERT")), ) index_weight = 3 - unit = models.ForeignKey(OrgUnit,verbose_name=_('org unit')) - organization = models.ForeignKey(Organization,verbose_name=_('organization'),null=True,blank=True) - parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) + unit = models.ForeignKey(OrgUnit,verbose_name=_('org unit'),on_delete=models.CASCADE) + organization = models.ForeignKey(Organization,verbose_name=_('organization'),null=True,blank=True,on_delete=models.CASCADE) + parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True,on_delete=models.CASCADE) code = models.CharField(_("position code"),max_length=const.DB_CHAR_CODE_8,blank=True,null=True) name = models.CharField(_("position name"),max_length=const.DB_CHAR_NAME_120) short = models.CharField(_("short name"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) diff --git a/plugin/wfactions.py b/plugin/wfactions.py index 803fc2e..bad9c89 100644 --- a/plugin/wfactions.py +++ b/plugin/wfactions.py @@ -1,5 +1,6 @@ # created at 15-6-30 # coding=utf-8 +import logging __author__ = 'zhugl' @@ -28,8 +29,8 @@ class TestAction(WorkflowAction): name = 'action.test' def action(self,request,obj,node_config,operation=Operation.APPROVE): - print 'this is a workflow test action' - print 'request user is %s,current node is %s'%(request.user,node_config) + logging.info('this is a workflow test action') + logging.info('request user is %s,current node is %s'%(request.user,node_config)) class WorkflowActionManager(object): diff --git a/plugin/xls.py b/plugin/xls.py index 7f07e6f..4e180bd 100644 --- a/plugin/xls.py +++ b/plugin/xls.py @@ -1,5 +1,5 @@ -# created at 15-6-27 # coding=utf-8 +# created at 15-6-27 __author__ = 'zhugl' import xlrd import os @@ -50,7 +50,7 @@ def department(self,obj,sheet): try: parent = OrgUnit.objects.get(code=row[4]) OrgUnit.objects.filter(code=row[0]).update(parent=parent) - except Exception,e: + except Exception: pass def position(self,obj,sheet): @@ -64,7 +64,7 @@ def position(self,obj,sheet): if len(row[4]) > 0: try: depart = OrgUnit.objects.filter(code=row[4],end__gt=datetime.date.today()).all()[0] - except Exception,e: + except Exception: pass weight = 99 if row[6]: @@ -77,7 +77,7 @@ def position(self,obj,sheet): try: parent = Position.objects.filter(code=row[2],end__gt=datetime.date.today()).all()[0] Position.objects.filter(code=row[0]).update(parent=parent) - except Exception,e: + except Exception: pass def stuff(self,obj,sheet): @@ -87,7 +87,7 @@ def stuff(self,obj,sheet): row_count = sheet.nrows try: group = Group.objects.get_by_natural_key(u'职员') - except Exception,e: + except Exception: pass for row_index in range(1,row_count): row = sheet.row_values(row_index) @@ -104,13 +104,13 @@ def stuff(self,obj,sheet): else: employee.position = position employee.save() - except Exception,e: + except Exception: employee = Employee.objects.create(code=row[0],name=row[1],pinyin=row[2],gender=row[3],idcard=row[4], birthday=row[5],workday=row[6],startday=row[7],position=position) if username: try: user = User.objects.get_by_natural_key(username) - except Exception,e: + except Exception: user = User.objects.create_user(username=username,password=password) user.is_staff = True user.is_active = True @@ -139,7 +139,7 @@ def handle(self,obj,f): row_count = sheet.nrows try: group = Group.objects.get_by_natural_key(u'职员') - except Exception,e: + except Exception: pass for row_index in range(2,row_count): @@ -153,7 +153,7 @@ def handle(self,obj,f): continue try: user = User.objects.get_by_natural_key(username) - except Exception,e: + except Exception: user = User.objects.create_user(username=username,password=password,email=email) user.is_staff = True user.is_active = True diff --git a/purchase/models.py b/purchase/models.py index 52cdf8e..0484cf8 100644 --- a/purchase/models.py +++ b/purchase/models.py @@ -8,7 +8,7 @@ from django.db.models.aggregates import Sum from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ -from django.utils.text import force_text +from django.utils.encoding import force_text from mis import settings from common import generic from common import const @@ -29,13 +29,13 @@ class PurchaseOrder(generic.BO): ) index_weight = 1 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"S"}) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"S"},on_delete=models.CASCADE) order_date = models.DateField(_("order date")) arrive_date = models.DateField(_("arrive date")) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_("description"),blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) amount = models.DecimalField(_("money amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) discount_amount = models.DecimalField(_("discount amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) @@ -79,12 +79,12 @@ def save(self, force_insert=False, force_update=False, using=None, try: measure = Measure.objects.get(code=row[4]) - except Exception,e: + except Exception: measure = Measure.objects.create(code=row[4],name=force_text(row[5])) try: material = Material.objects.get(code=row[0]) - except Exception,e: + except Exception: material = Material(code=row[0],name=force_text(row[1]),spec=force_text(row[2])) material.purchase_price = row[6] material.save() @@ -115,16 +115,16 @@ class POItem(models.Model): """ index_weight = 2 - po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order")) - material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0"}) - measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True) + po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order"),on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0"},on_delete=models.CASCADE) + measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True,on_delete=models.CASCADE) price = models.DecimalField(_("price"),max_digits=12,decimal_places=4,blank=True,null=True) cnt = models.DecimalField(_("count"),max_digits=12,decimal_places=4,blank=True,null=True) discount_price = models.DecimalField(_("discount price"),max_digits=12,decimal_places=4,blank=True,null=True) amount = models.DecimalField(_("money of amount"),max_digits=12,decimal_places=2,blank=True,null=True) discount_amount = models.DecimalField(_("discount amount"),max_digits=12,decimal_places=2,blank=True,null=True) tax = models.CharField(_("tax rate"),max_length=const.DB_CHAR_CODE_6,choices=const.get_value_list('S052'),default='0.00') - woitem = models.ForeignKey(WOItem,verbose_name=_("wo item"),blank=True,null=True) + woitem = models.ForeignKey(WOItem,verbose_name=_("wo item"),blank=True,null=True,on_delete=models.CASCADE) is_in_stock = models.BooleanField(_("is in stock"),default=0) in_stock_time = models.DateTimeField(_("execute time"),blank=True,null=True) entry_cnt = models.DecimalField(_("entry count"),max_digits=12,decimal_places=4,blank=True,null=True) @@ -169,8 +169,8 @@ class Invoice(generic.BO): vo_date = models.DateField(_("invoice date"),blank=True,null=True,default=datetime.date.today) code = models.CharField(_("invoice code"),max_length=const.DB_CHAR_NAME_20) number = models.CharField(_("invoice number"),max_length=const.DB_CHAR_NAME_20) - po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order")) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True) + po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order"),on_delete=models.CASCADE) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True,on_delete=models.CASCADE) po_amount = models.DecimalField(_("po amount"),max_digits=14,decimal_places=4,blank=True,null=True) vo_amount = models.DecimalField(_("invoice amount"),max_digits=14,decimal_places=4) file = models.FileField(_("invoice file"),upload_to='invoice',blank=True,null=True) @@ -196,13 +196,13 @@ class Payment(generic.BO): """ index_weight = 3 py_date = models.DateField(_("pay date"),blank=True,null=True,default=datetime.date.today) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) code = models.CharField(_("pay code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order")) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True) + po = models.ForeignKey(PurchaseOrder,verbose_name=_("purchase order"),on_delete=models.CASCADE) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True,on_delete=models.CASCADE) po_amount = models.DecimalField(_("po amount"),max_digits=14,decimal_places=4,blank=True,null=True) py_amount = models.DecimalField(_("pay amount"),max_digits=14,decimal_places=4) - bank = models.ForeignKey(BankAccount,verbose_name=_("bank account"),blank=True,null=True) + bank = models.ForeignKey(BankAccount,verbose_name=_("bank account"),blank=True,null=True,on_delete=models.CASCADE) response_code = models.CharField(_("response code"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) memo = models.TextField(_("memo"),blank=True,null=True) diff --git a/sale/models.py b/sale/models.py index d71d114..ce41dfa 100644 --- a/sale/models.py +++ b/sale/models.py @@ -9,7 +9,7 @@ from django.db import transaction from django.db.models.aggregates import Sum from django.contrib.auth.models import User -from django.utils.text import force_text +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common import generic from common import const @@ -29,10 +29,10 @@ class SaleOrder(generic.BO): ) index_weight = 2 code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"}) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"},on_delete=models.CASCADE) order_date = models.DateField(_("order date")) deliver_date = models.DateField(_("deliver date")) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_("memo"),blank=True,null=True) contact = models.CharField(_("contacts"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) @@ -43,7 +43,7 @@ class SaleOrder(generic.BO): amount = models.DecimalField(_("money amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) discount_amount = models.DecimalField(_("discount amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) - user = models.ForeignKey(User,verbose_name=_("sales man"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("sales man"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS) def __unicode__(self): @@ -72,9 +72,9 @@ class SaleItem(models.Model): """ 订单明细 """ - master = models.ForeignKey(SaleOrder) - material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0",'can_sale':'1'},blank=True,null=True) - measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True) + master = models.ForeignKey(SaleOrder,on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0",'can_sale':'1'},blank=True,null=True,on_delete=models.CASCADE) + measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True,on_delete=models.CASCADE) cnt = models.DecimalField(_("count"),max_digits=14,decimal_places=4) stock_price = models.DecimalField(_("stock price"),max_digits=14,decimal_places=4,blank=True,null=True) sale_price = models.DecimalField(_("sale price"),max_digits=14,decimal_places=4,blank=True,null=True) @@ -107,13 +107,13 @@ class PaymentCollection(generic.BO): """ index_weight = 3 collection_date = models.DateField(_("collection date"),blank=True,null=True,default=datetime.date.today) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) code = models.CharField(_("collection code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - so = models.ForeignKey(SaleOrder,verbose_name=_("sale order")) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True) + so = models.ForeignKey(SaleOrder,verbose_name=_("sale order"),on_delete=models.CASCADE) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),blank=True,null=True,on_delete=models.CASCADE) order_amount = models.DecimalField(_("order amount"),max_digits=14,decimal_places=4,blank=True,null=True) collection_amount = models.DecimalField(_("collection amount"),max_digits=14,decimal_places=4) - bank = models.ForeignKey(BankAccount,verbose_name=_("bank account"),blank=True,null=True) + bank = models.ForeignKey(BankAccount,verbose_name=_("bank account"),blank=True,null=True,on_delete=models.CASCADE) memo = models.TextField(_("memo"),blank=True,null=True) def __unicode__(self): @@ -145,16 +145,16 @@ class OfferSheet(generic.BO): ('9', _("APPROVED")), ) code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) - partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"}) + partner = models.ForeignKey(Partner,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"},on_delete=models.CASCADE) offer_date = models.DateField(_("offer date")) deliver_date = models.DateField(_("deliver date")) - org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True) + org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_("memo"),blank=True,null=True) amount = models.DecimalField(_("money amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) discount_amount = models.DecimalField(_("discount amount"),max_digits=12,decimal_places=2,blank=True,null=True,default=0.00) - user = models.ForeignKey(User,verbose_name=_("offer man"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("offer man"),blank=True,null=True,on_delete=models.CASCADE) attach = models.FileField(_('offer sheet file'),blank=True,null=True,upload_to='offer sheet',help_text=u'您可导入报价明细,模板请参考文档FD0006') status = models.BooleanField(_("executed"),default=0) @@ -195,12 +195,12 @@ def save(self, force_insert=False, force_update=False, using=None, try: measure = Measure.objects.get(code=row[4]) - except Exception,e: + except Exception: measure = Measure.objects.create(code=row[4],name=force_text(row[5])) try: material = Material.objects.get(code=row[0]) - except Exception,e: + except Exception: material = Material(code=row[0],name=force_text(row[1]),spec=force_text(row[2])) material.sale_price = row[6] material.purchase_price = row[7] @@ -221,9 +221,9 @@ class OfferItem(models.Model): """ 订单明细 """ - master = models.ForeignKey(OfferSheet) - material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0",'can_sale':'1'},blank=True,null=True) - measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True) + master = models.ForeignKey(OfferSheet,on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),limit_choices_to={"is_virtual":"0",'can_sale':'1'},blank=True,null=True,on_delete=models.CASCADE) + measure = models.ForeignKey(Measure,verbose_name=_("measure"),blank=True,null=True,on_delete=models.CASCADE) cnt = models.DecimalField(_("count"),max_digits=14,decimal_places=4) brand = models.CharField(_('brand'),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) cost_price = models.DecimalField(_("cost price"),max_digits=14,decimal_places=4,blank=True,null=True) diff --git a/selfhelp/admin.py b/selfhelp/admin.py index 0a52495..26abc62 100644 --- a/selfhelp/admin.py +++ b/selfhelp/admin.py @@ -108,7 +108,7 @@ def changeform_view(self, request, object_id=None, form_url='', extra_context=No if obj and obj.status == 'P': extra_context = extra_context or {} extra_context.update(dict(readonly=True)) - except Exception,e: + except Exception: pass return super(LoanAdmin,self).changeform_view(request,object_id,form_url,extra_context) @@ -182,7 +182,7 @@ def changeform_view(self, request, object_id=None, form_url='', extra_context=No if obj and obj.status == 'P': extra_context = extra_context or {} extra_context.update(dict(readonly=True)) - except Exception,e: + except Exception: pass return super(ReimbursementAdmin,self).changeform_view(request,object_id,form_url,extra_context) diff --git a/selfhelp/models.py b/selfhelp/models.py index 5fc023d..8fd87be 100644 --- a/selfhelp/models.py +++ b/selfhelp/models.py @@ -6,7 +6,7 @@ from django.db import transaction from django.db import models from django.contrib.auth.models import User -from django.utils.text import force_text +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common import generic from common import const @@ -21,16 +21,16 @@ class WorkOrder(generic.BO): """ index_weight = 1 code = models.CharField(_("workorder code"),blank=True,null=True,max_length=const.DB_CHAR_CODE_10) - refer = models.ForeignKey("self",verbose_name=_("refer wo"),blank=True,null=True) + refer = models.ForeignKey("self",verbose_name=_("refer wo"),blank=True,null=True,on_delete=models.CASCADE) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_120) description = models.TextField(_("description"),blank=True,null=True) business_domain = models.CharField(_("business domain"),max_length=const.DB_CHAR_CODE_4,choices=const.get_value_list('S045'),default='OT') classification = models.CharField(_("classification"),max_length=const.DB_CHAR_CODE_4,choices=const.get_value_list('S044'),default='D') - service = models.ForeignKey(Material,verbose_name=_("service name"),null=True,blank=True,limit_choices_to={"is_virtual":"1"}) - project = models.ForeignKey(Project,verbose_name=_("project"),null=True,blank=True) + service = models.ForeignKey(Material,verbose_name=_("service name"),null=True,blank=True,limit_choices_to={"is_virtual":"1"},on_delete=models.CASCADE) + project = models.ForeignKey(Project,verbose_name=_("project"),null=True,blank=True,on_delete=models.CASCADE) status = models.CharField(_("status"),blank=True,null=True,default='NEW',max_length=const.DB_CHAR_CODE_6,choices=const.get_value_list('S046')) answer = models.TextField(_("answer"),blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) attach = models.FileField(_('attach'),blank=True,null=True,help_text=u'工单附件,不导入明细。') detail = models.FileField(_('to be imported detail'),blank=True,null=True,help_text=u'您可导入需求明细,模板请参考文档FD0007') @@ -67,11 +67,11 @@ def save(self, force_insert=False, force_update=False, using=None, measure = None try: measure = Measure.objects.get(code=row[4]) - except Exception,e: + except Exception: measure = Measure.objects.create(code=row[4],name=force_text(row[5])) try: material = Material.objects.get(code=row[0]) - except Exception,e: + except Exception: material = Material(code=row[0],name=force_text(row[1]),spec=force_text(row[2])) material.save() WOItem.objects.create(workorder=self,material=material,measure=measure,amount=row[6]) @@ -88,8 +88,8 @@ class WOExtraValue(models.Model): """ """ - workorder = models.ForeignKey(WorkOrder,verbose_name=_("workorder")) - param_name = models.ForeignKey(ExtraParam,verbose_name=_("extra param")) + workorder = models.ForeignKey(WorkOrder,verbose_name=_("workorder"),on_delete=models.CASCADE) + param_name = models.ForeignKey(ExtraParam,verbose_name=_("extra param"),on_delete=models.CASCADE) param_value = models.CharField(_("param value"),blank=True,null=True,max_length=const.DB_CHAR_NAME_40) class Meta: @@ -101,10 +101,10 @@ class WOItem(models.Model): """ """ - workorder = models.ForeignKey(WorkOrder,verbose_name=_("workorder")) - material = models.ForeignKey(Material,verbose_name=_("material"),null=True,blank=True,limit_choices_to={"is_virtual":"0"}) + workorder = models.ForeignKey(WorkOrder,verbose_name=_("workorder"),on_delete=models.CASCADE) + material = models.ForeignKey(Material,verbose_name=_("material"),null=True,blank=True,limit_choices_to={"is_virtual":"0"},on_delete=models.CASCADE) amount = models.DecimalField(_("amount"),max_digits=10,decimal_places=4,blank=True,null=True) - measure = models.ForeignKey(Measure,verbose_name=_('measure'),blank=True,null=True) + measure = models.ForeignKey(Measure,verbose_name=_('measure'),blank=True,null=True,on_delete=models.CASCADE) price = models.DecimalField(_("price"),max_digits=10,decimal_places=4,blank=True,null=True) class Meta: @@ -126,8 +126,8 @@ class Loan(generic.BO): code = models.CharField(_("loan code"),max_length=const.DB_CHAR_CODE_10,blank=True,null=True) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_120) description = models.TextField(_("description"),blank=True,null=True) - project = models.ForeignKey(Project,verbose_name=_("project")) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) + project = models.ForeignKey(Project,verbose_name=_("project"),on_delete=models.CASCADE) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) status = models.CharField(_("status"),blank=True,null=True,default='N',max_length=const.DB_CHAR_CODE_2,choices=LOAD_STATUS) logout_time = models.DateTimeField(_("logout time"),blank=True,null=True) loan_amount = models.DecimalField(_("loan amount"),max_digits=10,decimal_places=2,blank=True,null=True) @@ -176,14 +176,14 @@ class Reimbursement(generic.BO): code = models.CharField(_("fee code"),max_length=const.DB_CHAR_CODE_10,blank=True,null=True) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_120) description = models.TextField(_("description"),blank=True,null=True) - project = models.ForeignKey(Project,verbose_name=_("project")) - wo = models.ForeignKey(WorkOrder,verbose_name=_("work order"),null=True,blank=True) - user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True) - org = models.ForeignKey(OrgUnit,verbose_name=_("cost center"),blank=True,null=True) + project = models.ForeignKey(Project,verbose_name=_("project"),on_delete=models.CASCADE) + wo = models.ForeignKey(WorkOrder,verbose_name=_("work order"),null=True,blank=True,on_delete=models.CASCADE) + user = models.ForeignKey(User,verbose_name=_("user"),blank=True,null=True,on_delete=models.CASCADE) + org = models.ForeignKey(OrgUnit,verbose_name=_("cost center"),blank=True,null=True,on_delete=models.CASCADE) bank_account = models.CharField(_("bank account"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True) status = models.CharField(_("status"),blank=True,null=True,default='N',max_length=const.DB_CHAR_CODE_2,choices=REIM_STATUS) amount = models.DecimalField(_("amount of money"),max_digits=10,decimal_places=2,blank=True,null=True) - loan = models.ForeignKey(Loan,verbose_name=_("loan record"),blank=True,null=True) + loan = models.ForeignKey(Loan,verbose_name=_("loan record"),blank=True,null=True,on_delete=models.CASCADE) loan_amount = models.DecimalField(_("loan amount"),max_digits=10,decimal_places=2,blank=True,null=True) logout_amount = models.DecimalField(_("logout amount"),max_digits=10,decimal_places=2,blank=True,null=True) pay_amount = models.DecimalField(_("pay amount"),max_digits=10,decimal_places=2,blank=True,null=True) @@ -250,8 +250,8 @@ class ReimbursementItem(models.Model): """ import datetime - reimbursement = models.ForeignKey(Reimbursement,verbose_name=_("reimbursement")) - expense_account = models.ForeignKey(ExpenseAccount,verbose_name=_("expenses account")) + reimbursement = models.ForeignKey(Reimbursement,verbose_name=_("reimbursement"),on_delete=models.CASCADE) + expense_account = models.ForeignKey(ExpenseAccount,verbose_name=_("expenses account"),on_delete=models.CASCADE) begin = models.DateField(_("occur date"),default=datetime.date.today) amount = models.DecimalField(_("amount of money"),max_digits=10,decimal_places=2) memo = models.CharField(_("memo"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True) @@ -283,12 +283,12 @@ class Activity(generic.BO): enroll_deadline = models.DateTimeField(_('enroll deadline'),blank=True,null=True) code = models.CharField(_("code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True) title = models.CharField(_("title"),max_length=const.DB_CHAR_NAME_120) - parent = models.ForeignKey('self',verbose_name=_("parent"),blank=True,null=True) + parent = models.ForeignKey('self',verbose_name=_("parent"),blank=True,null=True,on_delete=models.CASCADE) description = models.TextField(_("description"),blank=True,null=True) host = models.CharField(_("host"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) speaker = models.CharField(_("speaker"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) accept_enroll = models.BooleanField(_("accept enroll"),default=1) - room = models.ForeignKey(Material,verbose_name=_("room"),blank=True,null=True,limit_choices_to={'tp':20}) + room = models.ForeignKey(Material,verbose_name=_("room"),blank=True,null=True,limit_choices_to={'tp':20},on_delete=models.CASCADE) location = models.CharField(_("location"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) classification = models.CharField(_("classification"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=CLASSIFICATION,default='M') mail_list = models.TextField(_("mail list"),blank=True,null=True) @@ -314,8 +314,8 @@ class Feedback(models.Model): ('C','C'), ('D','D'), ) - activity = models.ForeignKey(Activity) - user = models.ForeignKey(User) + activity = models.ForeignKey(Activity,on_delete=models.CASCADE) + user = models.ForeignKey(User,on_delete=models.CASCADE) feed_time = models.DateTimeField(_("feedback time"),auto_now_add=True) rank = models.CharField(_('rank'),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=RANK,default='B') comment = models.CharField(_("suggest"),blank=True,null=True,max_length=const.DB_CHAR_NAME_80) @@ -325,6 +325,6 @@ class Enroll(models.Model): """ """ - activity = models.ForeignKey(Activity) - user = models.ForeignKey(User) + activity = models.ForeignKey(Activity,on_delete=models.CASCADE) + user = models.ForeignKey(User,on_delete=models.CASCADE) enroll_time = models.DateTimeField(_("enroll time"),auto_now_add=True) diff --git a/selfhelp/views.py b/selfhelp/views.py index 261d5a3..7aee157 100644 --- a/selfhelp/views.py +++ b/selfhelp/views.py @@ -28,7 +28,7 @@ def pay_action(request,model,object_id): try: obj.action_pay(request) messages.success(request,_('action successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/selfhelp/%s/%s"%(model,object_id)) diff --git a/syscfg/models.py b/syscfg/models.py index b84eebd..b0b3870 100644 --- a/syscfg/models.py +++ b/syscfg/models.py @@ -35,7 +35,7 @@ class Module(generic.BO): url = models.URLField(_("module url"),blank=True,null=True,max_length=const.DB_CHAR_NAME_80) weight = models.IntegerField(_("weight"),blank=True,null=True,default=99) icon = models.CharField(_("style class"),blank=True,null=True,max_length=const.DB_CHAR_NAME_40) - parent = models.ForeignKey('self',blank=True,null=True,verbose_name=_("parent")) + parent = models.ForeignKey('self',blank=True,null=True,verbose_name=_("parent"),on_delete=models.CASCADE) status = models.BooleanField(_("in use"),default=True) class Meta: @@ -48,7 +48,7 @@ class Menu(generic.BO): 菜单管理 """ index_weight = 3 - module = models.ForeignKey(Module,verbose_name=_("module")) + module = models.ForeignKey(Module,verbose_name=_("module"),on_delete=models.CASCADE) code = models.CharField(_("menu code"),max_length=const.DB_CHAR_CODE_6,blank=True,null=True) name = models.CharField(_("menu name"),max_length=const.DB_CHAR_NAME_40) url = models.URLField(_("menu url"),blank=True,null=True,max_length=const.DB_CHAR_NAME_80) @@ -70,7 +70,7 @@ class Role(generic.BO): name = models.CharField(_("role name"),max_length=const.DB_CHAR_NAME_40) description = models.CharField(_("description"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True) status = models.BooleanField(_("in use"),default=True) - parent = models.ForeignKey('self',blank=True,null=True,verbose_name=_("parent")) + parent = models.ForeignKey('self',blank=True,null=True,verbose_name=_("parent"),on_delete=models.CASCADE) users = models.ManyToManyField(User,verbose_name=_("role users"),blank=True) menus = models.ManyToManyField(Menu,verbose_name=_("role menus"),blank=True) diff --git a/workflow/admin.py b/workflow/admin.py index 39fe49d..048efc6 100644 --- a/workflow/admin.py +++ b/workflow/admin.py @@ -1,3 +1,4 @@ + from django.contrib import admin from django.contrib.contenttypes.models import ContentType from common import generic @@ -25,7 +26,6 @@ class WorkflowModelAdmin(admin.ModelAdmin): ) def get_form(self, request, obj=None, **kwargs): - print kwargs return super(WorkflowModelAdmin,self).get_form(request,obj,**kwargs) def save_model(self, request, obj, form, change): diff --git a/workflow/models.py b/workflow/models.py index 7bf9f40..992f265 100644 --- a/workflow/models.py +++ b/workflow/models.py @@ -18,7 +18,7 @@ class Modal(models.Model): code = models.CharField(_("workflow code"),max_length=const.DB_CHAR_CODE_6,blank=True,null=True) name = models.CharField(_("workflow name"),max_length=const.DB_CHAR_NAME_40) description = models.TextField(_("description"),blank=True,null=True) - content_type = models.ForeignKey(ContentType,verbose_name=_("content type"),limit_choices_to={"app_label__in":['basedata','organ']}) + content_type = models.ForeignKey(ContentType,verbose_name=_("content type"),limit_choices_to={"app_label__in":['basedata','organ']},on_delete=models.CASCADE) app_name = models.CharField(_("app name"),max_length=const.DB_CHAR_NAME_60,blank=True,null=True) model_name = models.CharField(_("model name"),max_length=const.DB_CHAR_NAME_60,blank=True,null=True) # added by zhugl 2015-05-10 @@ -50,7 +50,7 @@ class Node(models.Model): (4, _("submitter")), ) index_weight = 2 - modal = models.ForeignKey(Modal,verbose_name=_("workflow model")) + modal = models.ForeignKey(Modal,verbose_name=_("workflow model"),on_delete=models.CASCADE) code = models.CharField(_("node code"),max_length=const.DB_CHAR_CODE_4,blank=True,null=True) name = models.CharField(_("node name"),max_length=const.DB_CHAR_NAME_80) tooltip = models.CharField(_('tooltip words'),blank=True,null=True,max_length=const.DB_CHAR_NAME_120) @@ -108,9 +108,9 @@ class Instance(models.Model): ) index_weight = 3 code = models.CharField(_("code"),blank=True,null=True,max_length=const.DB_CHAR_CODE_10) - modal = models.ForeignKey(Modal,verbose_name=_("workflow model")) + modal = models.ForeignKey(Modal,verbose_name=_("workflow model"),on_delete=models.CASCADE) object_id = models.PositiveIntegerField("object id") - starter = models.ForeignKey(User,verbose_name=_("start user"),related_name="starter") + starter = models.ForeignKey(User,verbose_name=_("start user"),related_name="starter",on_delete=models.CASCADE) start_time = models.DateTimeField(_("start time"),auto_now_add=True) approved_time = models.DateTimeField(_("approved time"),blank=True,null=True) status = models.IntegerField(_("status"),default=1,choices=STATUS) @@ -142,9 +142,9 @@ class History(models.Model): (4, _("TERMINATE")), ) index_weight = 5 - inst = models.ForeignKey(Instance,verbose_name=_("workflow instance")) - node = models.ForeignKey(Node,verbose_name=_("workflow node"),blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("submitter")) + inst = models.ForeignKey(Instance,verbose_name=_("workflow instance"),on_delete=models.CASCADE) + node = models.ForeignKey(Node,verbose_name=_("workflow node"),blank=True,null=True,on_delete=models.CASCADE) + user = models.ForeignKey(User,verbose_name=_("submitter"),on_delete=models.CASCADE) pro_time = models.DateTimeField(_("process time"),auto_now_add=True) pro_type = models.IntegerField(_("process type"),choices=PROCESS_TYPE,default=0) memo = models.CharField(_("memo"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True) @@ -181,11 +181,11 @@ class TodoList(models.Model): """ index_weight = 4 code = models.CharField(_("code"),max_length=const.DB_CHAR_CODE_10,blank=True,null=True) - inst = models.ForeignKey(Instance,verbose_name=_("workflow instance")) - node = models.ForeignKey(Node,verbose_name=_("current node"),blank=True,null=True) + inst = models.ForeignKey(Instance,verbose_name=_("workflow instance"),on_delete=models.CASCADE) + node = models.ForeignKey(Node,verbose_name=_("current node"),blank=True,null=True,on_delete=models.CASCADE) app_name = models.CharField(_("app name"),max_length=const.DB_CHAR_NAME_60,blank=True,null=True) model_name = models.CharField(_("model name"),max_length=const.DB_CHAR_NAME_60,blank=True,null=True) - user = models.ForeignKey(User,verbose_name=_("handler")) + user = models.ForeignKey(User,verbose_name=_("handler"),on_delete=models.CASCADE) arrived_time = models.DateTimeField(_("arrived time"),auto_now_add=True) is_read = models.BooleanField(_("is read"),default=False) read_time = models.DateTimeField(_("read time"),blank=True,null=True) @@ -211,13 +211,10 @@ def code_link(self): code_link.short_description = _("code") def href(self): - import sys - reload(sys) - sys.setdefaultencoding("utf-8") ct = ContentType.objects.get(app_label=self.app_name,model=self.model_name) obj = ct.get_object_for_this_type(id=self.inst.object_id) - title = u"%s" % (obj) - return format_html("{}", + title = u"%s" % obj + return format_html(u"{}", self.app_name,self.model_name,self.inst.object_id,title) def modal_dsc(self): return u'%s'%(self.inst.modal.name) @@ -251,7 +248,7 @@ def get_modal(app_label,model_name): """ try: return Modal.objects.get(app_name=app_label,model_name=model_name) - except Exception,e: + except Exception: return None @@ -266,7 +263,7 @@ def get_instance(obj): if modal: try: return Instance.objects.get(modal=modal,object_id=obj.id) - except Exception,e: + except Exception: return None else: return None diff --git a/workflow/views.py b/workflow/views.py index df40cb9..ca21e3c 100644 --- a/workflow/views.py +++ b/workflow/views.py @@ -133,7 +133,7 @@ def start(request,app,model,object_id): try: setattr(obj,next_node.status_field,next_node.status_value) obj.save() - except Exception,e: + except Exception: pass messages.success(request,_('workflow started successfully')) return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id)) @@ -253,12 +253,12 @@ def approve(request,app,model,object_id,operation): try: setattr(obj,current_tmp.status_field,current_tmp.status_value) obj.save() - except Exception,e: + except Exception: pass History.objects.create(inst=workflow_instance,user=request.user,pro_type=int(operation),memo=memo,node=current_tmp) TodoList.objects.filter(inst=workflow_instance,node=current_tmp,status=0).update(status=1) messages.success(request,_('workflow approved successfully')) - except Exception,e: + except Exception as e: messages.error(request,e) pass if current_tmp.action and len(current_tmp.action) > 0: @@ -309,6 +309,6 @@ def restart(request,app,model,object_id,instance): messages.success(request,_("workflow restarted success")) else: messages.warning(request,_("you do not have the permission to restart,only the starter can restart")) - except Exception,e: + except Exception as e: messages.error(request,e) return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id)) \ No newline at end of file From c8f10c2eb8f9cf133543c1a94aa5c74e5bec19fa Mon Sep 17 00:00:00 2001 From: 007 <007gzs@gmail.com> Date: Tue, 15 May 2018 16:09:02 +0800 Subject: [PATCH 02/65] python 3 object.__str__ --- basedata/models.py | 21 +++++++++++---------- common/generic.py | 13 +++++++++++-- hr/models.py | 3 ++- syscfg/models.py | 3 ++- workflow/models.py | 11 ++++++----- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index 7bd4989..9344461 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -7,6 +7,7 @@ from django.utils.encoding import force_text from common import const from common import generic +from common.generic import ToStringMixin from syscfg.models import Module,Site from organ.models import Organization,Position import datetime @@ -39,7 +40,7 @@ class Meta: verbose_name_plural = _('value list') -class ValueListItem(models.Model): +class ValueListItem(models.Model, ToStringMixin): """ 值列表项 """ @@ -199,7 +200,7 @@ class Meta: verbose_name_plural = _('project') -class Warehouse(models.Model): +class Warehouse(models.Model, ToStringMixin): """ 仓库 """ @@ -219,7 +220,7 @@ class Meta: verbose_name_plural = _('warehouse') -class Measure(models.Model): +class Measure(models.Model, ToStringMixin): """ 计量单位 """ @@ -236,7 +237,7 @@ class Meta: verbose_name_plural = _('measure') -class Trade(models.Model): +class Trade(models.Model, ToStringMixin): """ 国民经济行业分类 """ @@ -255,7 +256,7 @@ class Meta: ordering = ['code'] -class Brand(models.Model): +class Brand(models.Model, ToStringMixin): """ 品牌 """ @@ -273,7 +274,7 @@ class Meta: verbose_name_plural = _('brand') -class Category(models.Model): +class Category(models.Model, ToStringMixin): """ 分类 """ @@ -292,7 +293,7 @@ class Meta: verbose_name_plural = _('category') -class TechnicalParameterName(models.Model): +class TechnicalParameterName(models.Model, ToStringMixin): """ 技术参数-名称,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ @@ -309,7 +310,7 @@ class Meta: verbose_name_plural = _('technical parameter') -class TechnicalParameterValue(models.Model): +class TechnicalParameterValue(models.Model, ToStringMixin): """ 技术参数-值,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ @@ -363,7 +364,7 @@ class Meta: ordering = ['tp','code'] -class MaterialParam(models.Model): +class MaterialParam(models.Model, ToStringMixin): """ """ @@ -380,7 +381,7 @@ class Meta: verbose_name_plural = _('material parameter') -class ExtraParam(models.Model): +class ExtraParam(models.Model, ToStringMixin): """ """ diff --git a/common/generic.py b/common/generic.py index 330b7c3..978812e 100644 --- a/common/generic.py +++ b/common/generic.py @@ -13,7 +13,7 @@ from django.contrib import admin from django.http import HttpRequest,HttpResponse from django.contrib.contenttypes.models import ContentType -from django.utils.encoding import smart_str, force_text +from django.utils.encoding import smart_str, force_text, force_str from django.utils.http import urlquote from django.utils.translation import ugettext_lazy as _ from common import const @@ -70,7 +70,16 @@ def get_query_set(self): return super(BOManager,self).get_query_set() -class BO(models.Model): +class ToStringMixin(object): + + def __unicode__(self): + return u'' + + def __str__(self): + return force_str(self.__unicode__()) + + +class BO(models.Model, ToStringMixin): """ All business object derive from this class """ diff --git a/hr/models.py b/hr/models.py index 9c81d73..3360e97 100644 --- a/hr/models.py +++ b/hr/models.py @@ -5,6 +5,7 @@ from common import generic from common import const from basedata.models import Position,Employee +from common.generic import ToStringMixin from organ.models import OrgUnit import datetime @@ -19,7 +20,7 @@ def value(self): return 0 -class SalaryItem(models.Model): +class SalaryItem(models.Model, ToStringMixin): """ 工资项 """ diff --git a/syscfg/models.py b/syscfg/models.py index b0b3870..d3137d2 100644 --- a/syscfg/models.py +++ b/syscfg/models.py @@ -4,9 +4,10 @@ from django.utils.translation import ugettext_lazy as _ from common import const from common import generic +from common.generic import ToStringMixin -class Site(models.Model): +class Site(models.Model, ToStringMixin): """ 站点,一个站点下可有多个公司,处于同一个站点下的用户逻辑上位于同一个组织 """ diff --git a/workflow/models.py b/workflow/models.py index 992f265..2603c8d 100644 --- a/workflow/models.py +++ b/workflow/models.py @@ -5,11 +5,12 @@ from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from common import const +from common.generic import ToStringMixin from syscfg.models import Role from organ.models import Position,OrgUnit -class Modal(models.Model): +class Modal(models.Model, ToStringMixin): """ """ @@ -33,7 +34,7 @@ class Meta: verbose_name_plural = _("workflow model") -class Node(models.Model): +class Node(models.Model, ToStringMixin): """ submitter() upper() @@ -94,7 +95,7 @@ class Meta: verbose_name_plural = _("workflow node") -class Instance(models.Model): +class Instance(models.Model, ToStringMixin): """ """ @@ -131,7 +132,7 @@ class Meta: verbose_name_plural = _("workflow instance") -class History(models.Model): +class History(models.Model, ToStringMixin): """ workflow history """ @@ -175,7 +176,7 @@ class Meta: ordering = ['inst','pro_time'] -class TodoList(models.Model): +class TodoList(models.Model, ToStringMixin): """ """ From 86ef82c46cc7d4508b53620994f7f551e294d3b6 Mon Sep 17 00:00:00 2001 From: 007 <007gzs@gmail.com> Date: Tue, 15 May 2018 16:10:57 +0800 Subject: [PATCH 03/65] =?UTF-8?q?=E6=B2=A1=E6=9C=89=5F=5Funicode=5F=5F?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E9=BB=98=E8=AE=A4=E8=B0=83=5F=5Fstr=5F=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/generic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/generic.py b/common/generic.py index 978812e..047212b 100644 --- a/common/generic.py +++ b/common/generic.py @@ -72,11 +72,11 @@ def get_query_set(self): class ToStringMixin(object): - def __unicode__(self): - return u'' - def __str__(self): - return force_str(self.__unicode__()) + if hasattr(self, '__unicode__'): + return force_str(self.__unicode__()) + else: + return super(ToStringMixin, self).__str__() class BO(models.Model, ToStringMixin): From abfe105a0fa36fa5bdf210d9d8c7a0bf49ab6284 Mon Sep 17 00:00:00 2001 From: 007 <007gzs@gmail.com> Date: Tue, 15 May 2018 16:15:55 +0800 Subject: [PATCH 04/65] =?UTF-8?q?=E7=BB=A7=E6=89=BF=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 20 ++++++++++---------- common/generic.py | 2 +- hr/models.py | 2 +- syscfg/models.py | 2 +- workflow/models.py | 10 +++++----- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index 9344461..2a7c7b2 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -40,7 +40,7 @@ class Meta: verbose_name_plural = _('value list') -class ValueListItem(models.Model, ToStringMixin): +class ValueListItem(ToStringMixin, models.Model): """ 值列表项 """ @@ -200,7 +200,7 @@ class Meta: verbose_name_plural = _('project') -class Warehouse(models.Model, ToStringMixin): +class Warehouse(ToStringMixin, models.Model): """ 仓库 """ @@ -220,7 +220,7 @@ class Meta: verbose_name_plural = _('warehouse') -class Measure(models.Model, ToStringMixin): +class Measure(ToStringMixin, models.Model): """ 计量单位 """ @@ -237,7 +237,7 @@ class Meta: verbose_name_plural = _('measure') -class Trade(models.Model, ToStringMixin): +class Trade(ToStringMixin, models.Model): """ 国民经济行业分类 """ @@ -256,7 +256,7 @@ class Meta: ordering = ['code'] -class Brand(models.Model, ToStringMixin): +class Brand(ToStringMixin, models.Model): """ 品牌 """ @@ -274,7 +274,7 @@ class Meta: verbose_name_plural = _('brand') -class Category(models.Model, ToStringMixin): +class Category(ToStringMixin, models.Model): """ 分类 """ @@ -293,7 +293,7 @@ class Meta: verbose_name_plural = _('category') -class TechnicalParameterName(models.Model, ToStringMixin): +class TechnicalParameterName(ToStringMixin, models.Model): """ 技术参数-名称,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ @@ -310,7 +310,7 @@ class Meta: verbose_name_plural = _('technical parameter') -class TechnicalParameterValue(models.Model, ToStringMixin): +class TechnicalParameterValue(ToStringMixin, models.Model): """ 技术参数-值,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数 """ @@ -364,7 +364,7 @@ class Meta: ordering = ['tp','code'] -class MaterialParam(models.Model, ToStringMixin): +class MaterialParam(ToStringMixin, models.Model): """ """ @@ -381,7 +381,7 @@ class Meta: verbose_name_plural = _('material parameter') -class ExtraParam(models.Model, ToStringMixin): +class ExtraParam(ToStringMixin, models.Model): """ """ diff --git a/common/generic.py b/common/generic.py index 047212b..d569a1f 100644 --- a/common/generic.py +++ b/common/generic.py @@ -79,7 +79,7 @@ def __str__(self): return super(ToStringMixin, self).__str__() -class BO(models.Model, ToStringMixin): +class BO(ToStringMixin, models.Model): """ All business object derive from this class """ diff --git a/hr/models.py b/hr/models.py index 3360e97..b62edd0 100644 --- a/hr/models.py +++ b/hr/models.py @@ -20,7 +20,7 @@ def value(self): return 0 -class SalaryItem(models.Model, ToStringMixin): +class SalaryItem(ToStringMixin, models.Model): """ 工资项 """ diff --git a/syscfg/models.py b/syscfg/models.py index d3137d2..a3d21e9 100644 --- a/syscfg/models.py +++ b/syscfg/models.py @@ -7,7 +7,7 @@ from common.generic import ToStringMixin -class Site(models.Model, ToStringMixin): +class Site(ToStringMixin, models.Model): """ 站点,一个站点下可有多个公司,处于同一个站点下的用户逻辑上位于同一个组织 """ diff --git a/workflow/models.py b/workflow/models.py index 2603c8d..0ef7be2 100644 --- a/workflow/models.py +++ b/workflow/models.py @@ -10,7 +10,7 @@ from organ.models import Position,OrgUnit -class Modal(models.Model, ToStringMixin): +class Modal(ToStringMixin, models.Model): """ """ @@ -34,7 +34,7 @@ class Meta: verbose_name_plural = _("workflow model") -class Node(models.Model, ToStringMixin): +class Node(ToStringMixin, models.Model): """ submitter() upper() @@ -95,7 +95,7 @@ class Meta: verbose_name_plural = _("workflow node") -class Instance(models.Model, ToStringMixin): +class Instance(ToStringMixin, models.Model): """ """ @@ -132,7 +132,7 @@ class Meta: verbose_name_plural = _("workflow instance") -class History(models.Model, ToStringMixin): +class History(ToStringMixin, models.Model): """ workflow history """ @@ -176,7 +176,7 @@ class Meta: ordering = ['inst','pro_time'] -class TodoList(models.Model, ToStringMixin): +class TodoList(ToStringMixin, models.Model): """ """ From d96122c750e3a3800dba02d6cefe0b441f3fa7b3 Mon Sep 17 00:00:00 2001 From: AngelLiang Date: Sat, 13 Jun 2020 20:59:58 +0800 Subject: [PATCH 05/65] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=BF=AB?= =?UTF-8?q?=E9=80=9F=E5=BC=80=E5=A7=8B=E7=9A=84=E6=96=87=E6=A1=A3=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + Pipfile | 15 + Pipfile.lock | 60 +++ basedata/migrations/0001_initial.py | 575 ++++++++++++++++++++++++++++ basedata/migrations/__init__.py | 0 basedata/models.py | 6 +- hr/migrations/0001_initial.py | 136 +++++++ hr/migrations/__init__.py | 0 invent/migrations/0001_initial.py | 264 +++++++++++++ invent/migrations/__init__.py | 0 mis/settings.py | 18 +- note.md | 8 + organ/migrations/0001_initial.py | 115 ++++++ organ/migrations/__init__.py | 0 purchase/migrations/0001_initial.py | 143 +++++++ purchase/migrations/__init__.py | 0 sale/migrations/0001_initial.py | 180 +++++++++ sale/migrations/__init__.py | 0 selfhelp/migrations/0001_initial.py | 224 +++++++++++ selfhelp/migrations/__init__.py | 0 syscfg/migrations/0001_initial.py | 107 ++++++ syscfg/migrations/__init__.py | 0 workflow/migrations/0001_initial.py | 155 ++++++++ workflow/migrations/__init__.py | 0 24 files changed, 2001 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 basedata/migrations/0001_initial.py create mode 100644 basedata/migrations/__init__.py create mode 100644 hr/migrations/0001_initial.py create mode 100644 hr/migrations/__init__.py create mode 100644 invent/migrations/0001_initial.py create mode 100644 invent/migrations/__init__.py create mode 100644 note.md create mode 100644 organ/migrations/0001_initial.py create mode 100644 organ/migrations/__init__.py create mode 100644 purchase/migrations/0001_initial.py create mode 100644 purchase/migrations/__init__.py create mode 100644 sale/migrations/0001_initial.py create mode 100644 sale/migrations/__init__.py create mode 100644 selfhelp/migrations/0001_initial.py create mode 100644 selfhelp/migrations/__init__.py create mode 100644 syscfg/migrations/0001_initial.py create mode 100644 syscfg/migrations/__init__.py create mode 100644 workflow/migrations/0001_initial.py create mode 100644 workflow/migrations/__init__.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04655ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.sqlite3 +.vscode/ +.venv/ diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..c2bbbc7 --- /dev/null +++ b/Pipfile @@ -0,0 +1,15 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +django = "<2.0" +xlwt = "*" +xlrd = "*" +pymysql = "*" + +[requires] +python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..71700da --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,60 @@ +{ + "_meta": { + "hash": { + "sha256": "8e22a5249afffe582a3836bfc0fac9f381e906443b4b95de1c2de25b94325fc4" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "2.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "django": { + "hashes": [ + "sha256:014e3392058d94f40569206a24523ce254d55ad2f9f46c6550b0fe2e4f94cf3f", + "sha256:4200aefb6678019a0acf0005cd14cfce3a5e6b9b90d06145fcdd2e474ad4329c" + ], + "index": "pypi", + "version": "==1.11.29" + }, + "pymysql": { + "hashes": [ + "sha256:3943fbbbc1e902f41daf7f9165519f140c4451c179380677e6a848587042561a", + "sha256:d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7" + ], + "index": "pypi", + "version": "==0.9.3" + }, + "pytz": { + "hashes": [ + "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", + "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" + ], + "version": "==2020.1" + }, + "xlrd": { + "hashes": [ + "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", + "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" + ], + "index": "pypi", + "version": "==1.2.0" + }, + "xlwt": { + "hashes": [ + "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", + "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88" + ], + "index": "pypi", + "version": "==1.3.0" + } + }, + "develop": {} +} diff --git a/basedata/migrations/0001_initial.py b/basedata/migrations/0001_initial.py new file mode 100644 index 0000000..5f703f9 --- /dev/null +++ b/basedata/migrations/0001_initial.py @@ -0,0 +1,575 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import basedata.models +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('syscfg', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Address', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('address_type', models.CharField(default=b'01', max_length=2, verbose_name='address type')), + ('address', models.CharField(max_length=120, verbose_name='address')), + ('zipcode', models.CharField(blank=True, max_length=8, null=True, verbose_name='zipcode')), + ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='phone')), + ('contacts', models.CharField(blank=True, max_length=40, null=True, verbose_name='contacts')), + ('object_id', models.PositiveIntegerField(blank=True, null=True)), + ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'address', + 'verbose_name_plural': 'address', + }, + ), + migrations.CreateModel( + name='BankAccount', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('account', models.CharField(max_length=40, verbose_name='account num')), + ('title', models.CharField(max_length=40, verbose_name='bank name')), + ('memo', models.CharField(blank=True, max_length=20, null=True, verbose_name='memo')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ], + options={ + 'verbose_name': 'bank account', + 'verbose_name_plural': 'bank account', + }, + ), + migrations.CreateModel( + name='Brand', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('weight', models.IntegerField(blank=True, default=99, null=True, verbose_name='weight')), + ], + options={ + 'verbose_name': 'brand', + 'verbose_name_plural': 'brand', + }, + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='code')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('path', models.CharField(blank=True, max_length=200, null=True, verbose_name='path')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Category', verbose_name='parent')), + ], + options={ + 'verbose_name': 'category', + 'verbose_name_plural': 'category', + }, + ), + migrations.CreateModel( + name='DataImport', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('imp_date', models.DateField(blank=True, default=datetime.datetime.today, null=True, verbose_name='date')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('attach', models.FileField(blank=True, null=True, upload_to=b'data', verbose_name='attach')), + ('is_clear', models.BooleanField(default=0, verbose_name='clear old data?')), + ('handler', models.CharField(blank=True, max_length=80, null=True, verbose_name='handler class')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='content type')), + ], + options={ + 'verbose_name': 'data import', + 'verbose_name_plural': 'data import', + }, + ), + migrations.CreateModel( + name='Document', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=120, verbose_name='title')), + ('keywords', models.CharField(blank=True, max_length=120, null=True, verbose_name='keywords')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('tp', models.CharField(choices=[(b'00', 'SYSTEM MANUAL'), (b'10', 'BUSINESS DOC')], default=b'10', max_length=2, verbose_name='type')), + ('business_domain', models.CharField(default=b'OT', max_length=4, verbose_name='business domain')), + ('status', models.CharField(choices=[(b'0', 'draft'), (b'1', 'published')], default=b'0', max_length=2, verbose_name='status')), + ('pub_date', models.DateTimeField(blank=True, null=True, verbose_name='publish date')), + ('size', models.CharField(blank=True, max_length=20, null=True, verbose_name='size')), + ('attach', models.FileField(blank=True, null=True, upload_to=b'doc', verbose_name='attach')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'document', + 'verbose_name_plural': 'documents', + }, + ), + migrations.CreateModel( + name='Education', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('edu_type', models.CharField(default=b'1', max_length=2, verbose_name='edu type')), + ('school', models.CharField(max_length=120, verbose_name='school')), + ('major', models.CharField(blank=True, max_length=120, null=True, verbose_name='major')), + ('degree', models.CharField(blank=True, default=b'4', max_length=2, null=True, verbose_name='major degree')), + ], + options={ + 'verbose_name': 'education experience', + 'verbose_name_plural': 'education experience', + }, + ), + migrations.CreateModel( + name='Employee', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='employee number')), + ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='phone')), + ('name', models.CharField(max_length=120, verbose_name='employee name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('birthday', models.DateField(blank=True, null=True, verbose_name='birthday')), + ('gender', models.CharField(default=b'1', max_length=2, verbose_name='gender')), + ('idcard', models.CharField(max_length=20, verbose_name='id card')), + ('country', models.CharField(blank=True, default=b'CN', max_length=2, null=True, verbose_name='nationality')), + ('hometown', models.CharField(blank=True, max_length=40, null=True, verbose_name='hometown')), + ('address', models.CharField(blank=True, max_length=120, null=True, verbose_name='home address')), + ('banknum', models.CharField(blank=True, max_length=40, null=True, verbose_name='bank account')), + ('bankname', models.CharField(blank=True, max_length=80, null=True, verbose_name='bank name')), + ('emergency', models.CharField(blank=True, max_length=40, null=True, verbose_name='emergency contacts')), + ('email', models.CharField(blank=True, max_length=20, null=True, verbose_name='email')), + ('office', models.CharField(blank=True, max_length=20, null=True, verbose_name='office phone')), + ('rank', models.CharField(default=b'00', max_length=2, verbose_name='employee rank')), + ('workday', models.DateField(blank=True, null=True, verbose_name='workday')), + ('startday', models.DateField(blank=True, null=True, verbose_name='start date')), + ('religion', models.CharField(blank=True, default=b'00', max_length=2, null=True, verbose_name='religion')), + ('marital', models.CharField(blank=True, default=b'10', max_length=2, null=True, verbose_name='marital status')), + ('party', models.CharField(blank=True, default=b'13', max_length=2, null=True, verbose_name='political party')), + ('nation', models.CharField(blank=True, default=b'01', max_length=2, null=True, verbose_name='nation')), + ('ygxs', models.CharField(blank=True, default=b'2', max_length=2, null=True, verbose_name='employ ygxs')), + ('status', models.CharField(blank=True, default=b'10', max_length=2, null=True, verbose_name='employ status')), + ('category', models.CharField(blank=True, default=b'21', max_length=2, null=True, verbose_name='employ category')), + ('literacy', models.CharField(blank=True, default=b'10', max_length=2, null=True, verbose_name='literacy')), + ('major', models.CharField(blank=True, default=b'99', max_length=2, null=True, verbose_name='major type')), + ('degree', models.CharField(blank=True, default=b'4', max_length=2, null=True, verbose_name='major degree')), + ('spjob', models.CharField(blank=True, default=b'00', max_length=2, null=True, verbose_name='special job')), + ('health', models.CharField(blank=True, default=b'1', max_length=2, null=True, verbose_name='health')), + ('tag1', models.CharField(blank=True, default=b'99', max_length=2, null=True, verbose_name='tag1 fzjr')), + ('tag2', models.CharField(blank=True, default=b'9', max_length=2, null=True, verbose_name='tag2 dwld')), + ('tag3', models.CharField(blank=True, default=b'00', max_length=2, null=True, verbose_name='tag3 dsjs')), + ('tag4', models.CharField(blank=True, default=b'0', max_length=2, null=True, verbose_name='tag4 byzk')), + ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('position', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organ.Position', verbose_name='position')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'employee', + 'verbose_name_plural': 'employee', + 'permissions': (('view_all_employee', 'view all employee'),), + }, + ), + migrations.CreateModel( + name='ExpenseAccount', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('category', models.CharField(choices=[(b'HR', 'HR-DOMAIN'), (b'OF', 'OFFICE-DOMAIN'), (b'PU', 'PUBLIS-DOMAIN'), (b'MU', 'MUNADOMAIN'), (b'BU', 'BUSINESS'), (b'OT', 'OTHER')], default=b'PU', max_length=4, verbose_name='category')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.ExpenseAccount', verbose_name='parent')), + ], + options={ + 'ordering': ['category', 'code'], + 'verbose_name': 'expenses account', + 'verbose_name_plural': 'expenses account', + }, + ), + migrations.CreateModel( + name='ExtraParam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=40, verbose_name='name')), + ('data_type', models.CharField(choices=[(b'CHAR', 'CHAR'), (b'NUM', 'NUMBER'), (b'DATE', 'DATE')], default=b'CHAR', max_length=6, verbose_name='data type')), + ('data_source', models.CharField(blank=True, max_length=40, null=True, verbose_name='data source')), + ], + options={ + 'verbose_name': 'extra param', + 'verbose_name_plural': 'extra params', + }, + ), + migrations.CreateModel( + name='Family', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('relation', models.CharField(blank=True, max_length=2, null=True, verbose_name='family title')), + ('status', models.CharField(blank=True, default=b'17', max_length=2, null=True, verbose_name='social status')), + ('name', models.CharField(max_length=60, verbose_name='name')), + ('birthday', models.DateField(blank=True, null=True, verbose_name='birthday')), + ('organization', models.CharField(blank=True, max_length=120, null=True, verbose_name='organization')), + ('phone', models.CharField(blank=True, max_length=120, null=True, verbose_name='phone')), + ('emergency', models.BooleanField(default=False, verbose_name='emergency')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee')), + ], + options={ + 'verbose_name': 'family member', + 'verbose_name_plural': 'family member', + }, + ), + migrations.CreateModel( + name='Material', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='material code')), + ('barcode', models.CharField(blank=True, max_length=40, null=True, verbose_name='bar code')), + ('name', models.CharField(max_length=120, verbose_name='material name')), + ('spec', models.CharField(blank=True, max_length=120, null=True, verbose_name='specifications')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('tp', models.CharField(blank=True, default=b'10', max_length=2, null=True, verbose_name='mt type')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('is_equip', models.BooleanField(default=False, verbose_name='is equipment')), + ('can_sale', models.BooleanField(default=True, verbose_name='can sale')), + ('is_virtual', models.BooleanField(default=False, verbose_name='is virtual')), + ('stock_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='stock price')), + ('purchase_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='purchase price')), + ('sale_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='sale price')), + ('brand', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Brand', verbose_name='brand')), + ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Category', verbose_name='category')), + ], + options={ + 'ordering': ['tp', 'code'], + 'verbose_name': 'material', + 'verbose_name_plural': 'material', + }, + ), + migrations.CreateModel( + name='MaterialParam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('creation', models.DateField(auto_now_add=True)), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Material')), + ], + options={ + 'verbose_name': 'material parameter', + 'verbose_name_plural': 'material parameter', + }, + ), + migrations.CreateModel( + name='Measure', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='code')), + ('name', models.CharField(max_length=20, verbose_name='name')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ], + options={ + 'verbose_name': 'measure', + 'verbose_name_plural': 'measure', + }, + ), + migrations.CreateModel( + name='Partner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='partner code')), + ('name', models.CharField(max_length=120, verbose_name='partner name')), + ('short', models.CharField(blank=True, max_length=20, null=True, verbose_name='short name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('partner_type', models.CharField(choices=[(b'C', 'Customer'), (b'S', 'Supplier')], default=b'C', max_length=2, verbose_name='type')), + ('level', models.CharField(choices=[(b'A', b'A'), (b'B', b'B'), (b'C', b'C'), (b'D', b'D')], default=b'C', max_length=2, verbose_name='level')), + ('tax_num', models.CharField(blank=True, max_length=40, null=True, verbose_name='tax num')), + ('tax_address', models.CharField(blank=True, max_length=40, null=True, verbose_name='tax address')), + ('tax_account', models.CharField(blank=True, max_length=80, null=True, verbose_name='tax account')), + ('contacts', models.CharField(blank=True, max_length=40, null=True, verbose_name='contacts')), + ('phone', models.CharField(blank=True, max_length=40, null=True, verbose_name='phone')), + ('memo', models.TextField(blank=True, null=True, verbose_name='memo')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ], + options={ + 'verbose_name': 'partner', + 'verbose_name_plural': 'partner', + 'permissions': (('view_all_customer', 'view all customer'), ('view_all_supplier', 'view all supplier')), + }, + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='project code')), + ('name', models.CharField(max_length=120, verbose_name='project name')), + ('short', models.CharField(blank=True, max_length=20, null=True, verbose_name='short name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('status', models.CharField(blank=True, default=b'00', max_length=2, null=True, verbose_name='status')), + ('prj_type', models.CharField(blank=True, default=b'00', max_length=2, null=True, verbose_name='project type')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('budget', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='budget')), + ('income', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='income')), + ('expand', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='expand')), + ('blueprint', models.FileField(blank=True, null=True, upload_to=b'project', verbose_name='blueprint')), + ('offer', models.FileField(blank=True, null=True, upload_to=b'offer sheet', verbose_name='offer sheet')), + ('business', models.FileField(blank=True, null=True, upload_to=b'project', verbose_name='business document')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='related users')), + ], + options={ + 'verbose_name': 'project', + 'verbose_name_plural': 'project', + }, + ), + migrations.CreateModel( + name='TechnicalParameterName', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=40, verbose_name='name')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Category', verbose_name='material category')), + ], + options={ + 'verbose_name': 'technical parameter', + 'verbose_name_plural': 'technical parameter', + }, + ), + migrations.CreateModel( + name='TechnicalParameterValue', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', models.CharField(max_length=80, verbose_name='value')), + ('description', models.CharField(blank=True, max_length=80, null=True, verbose_name='description')), + ('tech_name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.TechnicalParameterName', verbose_name='technical name')), + ], + options={ + 'verbose_name': 'technical value', + 'verbose_name_plural': 'technical value', + }, + ), + migrations.CreateModel( + name='Trade', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=6, verbose_name='code')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('memo', models.CharField(blank=True, max_length=120, null=True, verbose_name='memo')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Trade', verbose_name='parent')), + ], + options={ + 'ordering': ['code'], + 'verbose_name': 'trade', + 'verbose_name_plural': 'trade', + }, + ), + migrations.CreateModel( + name='ValueList', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='list code')), + ('name', models.CharField(max_length=40, verbose_name='list name')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('init', models.BooleanField(default=False, verbose_name='is init')), + ('locked', models.BooleanField(default=False, verbose_name='is locked')), + ('lock_time', models.DateTimeField(blank=True, null=True, verbose_name='locked time')), + ('locked_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='locked by')), + ('module', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='syscfg.Module', verbose_name='module')), + ], + options={ + 'verbose_name': 'value list', + 'verbose_name_plural': 'value list', + }, + ), + migrations.CreateModel( + name='ValueListItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('group_code', models.CharField(blank=True, max_length=6, null=True)), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='item code')), + ('name', models.CharField(max_length=40, verbose_name='item name')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('weight', models.IntegerField(default=9, null=True, verbose_name='weight')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.ValueList', verbose_name='list group')), + ], + options={ + 'ordering': ['weight', 'code'], + 'verbose_name': 'list item', + 'verbose_name_plural': 'list item', + }, + ), + migrations.CreateModel( + name='Warehouse', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='code')), + ('name', models.CharField(max_length=40, verbose_name='name')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('location', models.CharField(blank=True, max_length=120, null=True, verbose_name='location')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='related users')), + ], + options={ + 'verbose_name': 'warehouse', + 'verbose_name_plural': 'warehouse', + }, + ), + migrations.CreateModel( + name='WorkExperience', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('organization', models.CharField(max_length=120, verbose_name='organization')), + ('position', models.CharField(max_length=120, verbose_name='position')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee')), + ], + options={ + 'verbose_name': 'work experience', + 'verbose_name_plural': 'work experience', + }, + ), + migrations.AddField( + model_name='materialparam', + name='param_name', + field=models.ForeignKey(blank=basedata.models.Trade, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.TechnicalParameterName'), + ), + migrations.AddField( + model_name='materialparam', + name='param_value', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.TechnicalParameterValue'), + ), + migrations.AddField( + model_name='material', + name='measure', + field=models.ManyToManyField(to='basedata.Measure', verbose_name='measure'), + ), + migrations.AddField( + model_name='material', + name='org', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization'), + ), + migrations.AddField( + model_name='material', + name='params', + field=models.ManyToManyField(through='basedata.MaterialParam', to='basedata.TechnicalParameterValue', verbose_name='technical parameter'), + ), + migrations.AddField( + model_name='material', + name='warehouse', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Warehouse', verbose_name='warehouse'), + ), + migrations.AddField( + model_name='extraparam', + name='material', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material'), + ), + migrations.AddField( + model_name='education', + name='employee', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee'), + ), + migrations.AddField( + model_name='category', + name='trade', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Trade', verbose_name='trade'), + ), + migrations.AddField( + model_name='brand', + name='trade', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Trade', verbose_name='trade'), + ), + migrations.AddField( + model_name='bankaccount', + name='partner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner'), + ), + migrations.AlterIndexTogether( + name='valuelistitem', + index_together=set([('group', 'group_code')]), + ), + ] diff --git a/basedata/migrations/__init__.py b/basedata/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/basedata/models.py b/basedata/models.py index 68f77f6..add78a2 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -74,8 +74,12 @@ def get_value_list(group): :param group: :return: """ + from django.db.utils import OperationalError if group: - return tuple([(item.code, item.name) for item in ValueListItem.objects.filter(group_code__exact=group,status=1)]) + try: + return tuple([(item.code, item.name) for item in ValueListItem.objects.filter(group_code__exact=group,status=1)]) + except OperationalError: + return None else: return None diff --git a/hr/migrations/0001_initial.py b/hr/migrations/0001_initial.py new file mode 100644 index 0000000..5ebfc69 --- /dev/null +++ b/hr/migrations/0001_initial.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('organ', '0001_initial'), + ('basedata', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Departure', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee')), + ], + options={ + 'verbose_name': 'employee departure', + 'verbose_name_plural': 'employee departures', + }, + ), + migrations.CreateModel( + name='EmployeeSalaryItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('calculate_way', models.CharField(default=b'10', max_length=2, verbose_name='calculate way')), + ('fixed_value', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='fixed value')), + ('base_value', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='base value')), + ('org_percent', models.DecimalField(blank=True, decimal_places=2, max_digits=4, null=True, verbose_name='org percent')), + ('employee_percent', models.DecimalField(blank=True, decimal_places=2, max_digits=4, null=True, verbose_name='employee percent')), + ('employee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee')), + ], + options={ + 'verbose_name': 'salary item', + 'verbose_name_plural': 'salary item', + }, + ), + migrations.CreateModel( + name='Entry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='employee number')), + ('name', models.CharField(max_length=120, verbose_name='employee name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('birthday', models.DateField(blank=True, null=True, verbose_name='birthday')), + ('gender', models.CharField(default=b'1', max_length=2, verbose_name='gender')), + ('idcard', models.CharField(max_length=20, verbose_name='id card')), + ('address', models.CharField(blank=True, max_length=120, null=True, verbose_name='mail address')), + ('zipcode', models.CharField(max_length=8, verbose_name='zipcode')), + ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='phone')), + ('rank', models.CharField(default=b'00', max_length=2, verbose_name='employee rank')), + ('ygxs', models.CharField(blank=True, default=b'2', max_length=2, null=True, verbose_name='employ ygxs')), + ('category', models.CharField(blank=True, default=b'21', max_length=2, null=True, verbose_name='employ category')), + ('probation_months', models.CharField(default=b'3', max_length=2, verbose_name='probation months')), + ('probation_begin', models.DateField(default=datetime.date.today, verbose_name='probation begin')), + ('probation_end', models.DateField(blank=True, null=True, verbose_name='probation end')), + ('memo', models.TextField(blank=True, null=True, verbose_name='memo')), + ('profile', models.FileField(blank=True, null=True, upload_to=b'hr profile', verbose_name='profile')), + ('guider', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='guider')), + ('position', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organ.Position', verbose_name='designate position')), + ], + options={ + 'verbose_name': 'employee entry', + 'verbose_name_plural': 'employee entries', + 'permissions': (('modify_salary_item', 'modify salary item'),), + }, + ), + migrations.CreateModel( + name='SalaryItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=10, null=True, verbose_name='code')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('classification', models.CharField(default=b'10', max_length=2, verbose_name='classification')), + ('plus_or_minus', models.CharField(default=b'+', max_length=2, verbose_name='plus or minus')), + ('required', models.BooleanField(default=0, verbose_name='is required')), + ], + options={ + 'ordering': ('code',), + 'verbose_name': 'salary item', + 'verbose_name_plural': 'salary items', + }, + ), + migrations.CreateModel( + name='Transfer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Employee', verbose_name='employee')), + ], + options={ + 'verbose_name': 'employee transfer', + 'verbose_name_plural': 'employee transfers', + }, + ), + migrations.AddField( + model_name='employeesalaryitem', + name='entry', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hr.Entry', verbose_name='employee entry'), + ), + migrations.AddField( + model_name='employeesalaryitem', + name='salary_item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hr.SalaryItem', verbose_name='salary item'), + ), + migrations.AlterUniqueTogether( + name='employeesalaryitem', + unique_together=set([('entry', 'salary_item')]), + ), + ] diff --git a/hr/migrations/__init__.py b/hr/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/invent/migrations/0001_initial.py b/invent/migrations/0001_initial.py new file mode 100644 index 0000000..b56431d --- /dev/null +++ b/invent/migrations/0001_initial.py @@ -0,0 +1,264 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('selfhelp', '0001_initial'), + ('purchase', '0001_initial'), + ('basedata', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='InitialInventory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'9', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('execute_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('attach', models.FileField(blank=True, help_text='\u53c2\u8003FD0002\u6a21\u677f\u6587\u6863', null=True, upload_to=b'inventory', verbose_name='attach')), + ('amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='money of amount')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'Initial Inventory', + 'verbose_name_plural': 'Initial Inventory', + }, + ), + migrations.CreateModel( + name='InOutDetail', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='create time')), + ('status', models.BooleanField(default=0, verbose_name='executed')), + ('event_time', models.DateTimeField(blank=True, null=True, verbose_name='event time')), + ('cnt', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='count')), + ('batch', models.CharField(blank=True, max_length=20, null=True, verbose_name='batch')), + ('price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='price')), + ('prop', models.CharField(choices=[(b'+', 'PLUS'), (b'-', 'MINUS')], default=b'+', max_length=2, verbose_name='plus or minus property')), + ('source', models.CharField(blank=True, max_length=20, null=True, verbose_name='source')), + ], + ), + migrations.CreateModel( + name='Inventory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('cnt', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='count')), + ('batch', models.CharField(blank=True, max_length=20, null=True, verbose_name='batch')), + ('price', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='price')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material')), + ('measure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('warehouse', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Warehouse', verbose_name='warehouse')), + ], + options={ + 'ordering': ['material'], + 'verbose_name': 'Inventory', + 'verbose_name_plural': 'Inventory', + }, + ), + migrations.CreateModel( + name='StockIn', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'QUALITY TESTING'), (b'9', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('execute_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='stock in money of amount')), + ('batch', models.CharField(blank=True, max_length=20, null=True, verbose_name='batch')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('po', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='purchase.PurchaseOrder', verbose_name='purchase order')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ('warehouse', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Warehouse', verbose_name='warehouse')), + ], + options={ + 'verbose_name': 'StockIn', + 'verbose_name_plural': 'StockIn', + }, + ), + migrations.CreateModel( + name='StockOut', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='money of amount')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'IN PROGRESS'), (b'9', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('execute_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Project', verbose_name='project')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='out user')), + ('wo', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WorkOrder', verbose_name='work order')), + ], + options={ + 'verbose_name': 'StockOut', + 'verbose_name_plural': 'StockOut', + }, + ), + migrations.CreateModel( + name='WareAdjust', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'IN PROGRESS'), (b'9', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('execute_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='out user')), + ], + options={ + 'verbose_name': 'ware adjust', + 'verbose_name_plural': 'ware adjust', + }, + ), + migrations.CreateModel( + name='WareReturn', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='money of amount')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'IN PROGRESS'), (b'9', 'EXECUTED')], default=b'0', max_length=2, verbose_name='status')), + ('execute_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('out', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.StockOut', verbose_name='StockOut')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='out user')), + ], + options={ + 'verbose_name': 'ware return', + 'verbose_name_plural': 'ware return', + }, + ), + migrations.CreateModel( + name='AdjustItem', + fields=[ + ('inoutdetail_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invent.InOutDetail')), + ('inventory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='invent.Inventory', verbose_name='inventory material')), + ('master', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.WareAdjust')), + ], + options={ + 'verbose_name': 'adjust item', + 'verbose_name_plural': 'adjust item', + }, + bases=('invent.inoutdetail',), + ), + migrations.CreateModel( + name='InItem', + fields=[ + ('inoutdetail_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invent.InOutDetail')), + ('master', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.StockIn')), + ('po_item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='purchase.POItem', verbose_name='po item')), + ], + options={ + 'verbose_name': 'in item', + 'verbose_name_plural': 'in item', + }, + bases=('invent.inoutdetail',), + ), + migrations.CreateModel( + name='InitItem', + fields=[ + ('inoutdetail_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invent.InOutDetail')), + ('master', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.InitialInventory')), + ], + options={ + 'verbose_name': 'init item', + 'verbose_name_plural': 'init item', + }, + bases=('invent.inoutdetail',), + ), + migrations.CreateModel( + name='OutItem', + fields=[ + ('inoutdetail_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invent.InOutDetail')), + ('inventory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='invent.Inventory', verbose_name='inventory material')), + ('master', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.StockOut')), + ], + options={ + 'verbose_name': 'out item', + 'verbose_name_plural': 'out item', + }, + bases=('invent.inoutdetail',), + ), + migrations.CreateModel( + name='ReturnItem', + fields=[ + ('inoutdetail_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='invent.InOutDetail')), + ('out_cnt', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='out count')), + ('master', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='invent.WareReturn')), + ('out_item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='invent.OutItem', verbose_name='out item')), + ], + options={ + 'verbose_name': 'return item', + 'verbose_name_plural': 'return item', + }, + bases=('invent.inoutdetail',), + ), + migrations.AddField( + model_name='inoutdetail', + name='material', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material'), + ), + migrations.AddField( + model_name='inoutdetail', + name='measure', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure'), + ), + migrations.AddField( + model_name='inoutdetail', + name='warehouse', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Warehouse', verbose_name='warehouse'), + ), + ] diff --git a/invent/migrations/__init__.py b/invent/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mis/settings.py b/mis/settings.py index 5e4b36b..7938291 100644 --- a/mis/settings.py +++ b/mis/settings.py @@ -86,13 +86,17 @@ # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { + # 'default': { + # 'ENGINE': 'django.db.backends.mysql', + # 'HOST': 'localhost', + # 'NAME': 'mis', + # 'USER': 'root', + # 'PASSWORD': 'root', + # } 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'HOST': 'localhost', - 'NAME': 'mis', - 'USER': 'root', - 'PASSWORD': 'root', - } + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + }, } @@ -124,4 +128,4 @@ ) MEDIA_ROOT = os.path.join(BASE_DIR,'upload') -MEDIA_URL = '/upload/' \ No newline at end of file +MEDIA_URL = '/upload/' diff --git a/note.md b/note.md new file mode 100644 index 0000000..a913bdf --- /dev/null +++ b/note.md @@ -0,0 +1,8 @@ +## 快速开始 + + pipenv install + pipenv shell + # python manage.py makemigrations sale purchase invent hr selfhelp workflow organ basedata syscfg + python manage.py migrate + python manage.py createsuperuser + python manage.py runserver diff --git a/organ/migrations/0001_initial.py b/organ/migrations/0001_initial.py new file mode 100644 index 0000000..5d71812 --- /dev/null +++ b/organ/migrations/0001_initial.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Organization', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='organ code')), + ('name', models.CharField(max_length=120, verbose_name='organ name')), + ('short', models.CharField(blank=True, max_length=20, null=True, verbose_name='short name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('tax_num', models.CharField(blank=True, max_length=40, null=True, verbose_name='tax num')), + ('tax_address', models.CharField(blank=True, max_length=40, null=True, verbose_name='tax address')), + ('tax_account', models.CharField(blank=True, max_length=80, null=True, verbose_name='tax account')), + ('represent', models.CharField(blank=True, max_length=40, null=True, verbose_name='representative ')), + ('address', models.CharField(blank=True, max_length=120, null=True, verbose_name='address')), + ('zipcode', models.CharField(blank=True, max_length=8, null=True, verbose_name='zipcode')), + ('fax', models.CharField(blank=True, max_length=20, null=True, verbose_name='fax')), + ('contacts', models.CharField(blank=True, max_length=40, null=True, verbose_name='contacts')), + ('phone', models.CharField(blank=True, max_length=40, null=True, verbose_name='phone')), + ('website', models.CharField(blank=True, max_length=40, null=True, verbose_name='website')), + ('email', models.CharField(blank=True, max_length=40, null=True, verbose_name='email')), + ('lic_code', models.CharField(blank=True, max_length=40, null=True, verbose_name='license code')), + ('cer_code', models.CharField(blank=True, max_length=40, null=True, verbose_name='certificate code')), + ('license', models.FileField(blank=True, null=True, upload_to=b'organ', verbose_name='business license')), + ('certificate', models.FileField(blank=True, null=True, upload_to=b'organ', verbose_name='organization code certificate')), + ('weight', models.IntegerField(default=9, verbose_name='weight')), + ], + options={ + 'verbose_name': 'organization', + 'verbose_name_plural': 'organization', + }, + ), + migrations.CreateModel( + name='OrgUnit', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=8, null=True, verbose_name='code')), + ('name', models.CharField(max_length=120, verbose_name='name')), + ('short', models.CharField(blank=True, max_length=20, null=True, verbose_name='short name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('unit_type', models.IntegerField(choices=[(1, 'BRANCH'), (2, 'DEPARTMENT'), (3, 'OFFICE'), (4, 'TEAM'), (5, 'COMMITTEE')], default=2, verbose_name='type')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('virtual', models.BooleanField(default=False, verbose_name='is virtual')), + ('fax', models.CharField(blank=True, max_length=20, null=True, verbose_name='fax')), + ('phone', models.CharField(blank=True, max_length=40, null=True, verbose_name='phone')), + ('contacts', models.CharField(blank=True, max_length=40, null=True, verbose_name='contacts')), + ('email', models.CharField(blank=True, max_length=40, null=True, verbose_name='email')), + ('weight', models.IntegerField(default=99, verbose_name='weight')), + ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.OrgUnit', verbose_name='parent')), + ], + options={ + 'verbose_name': 'org unit', + 'verbose_name_plural': 'org unit', + }, + ), + migrations.CreateModel( + name='Position', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=8, null=True, verbose_name='position code')), + ('name', models.CharField(max_length=120, verbose_name='position name')), + ('short', models.CharField(blank=True, max_length=20, null=True, verbose_name='short name')), + ('pinyin', models.CharField(blank=True, max_length=120, null=True, verbose_name='pinyin')), + ('series', models.CharField(default=b'A', max_length=1, verbose_name='position series')), + ('grade', models.CharField(default=b'01', max_length=2, verbose_name='position grade')), + ('virtual', models.BooleanField(default=False, verbose_name='is virtual')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('description', models.TextField(blank=True, null=True, verbose_name='position description')), + ('qualification', models.TextField(blank=True, null=True, verbose_name='qualification')), + ('document', models.FileField(blank=True, null=True, upload_to=b'', verbose_name='reference')), + ('weight', models.IntegerField(default=99, verbose_name='weight')), + ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Position', verbose_name='parent')), + ('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organ.OrgUnit', verbose_name='org unit')), + ], + options={ + 'verbose_name': 'position', + 'verbose_name_plural': 'position', + }, + ), + ] diff --git a/organ/migrations/__init__.py b/organ/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/purchase/migrations/0001_initial.py b/purchase/migrations/0001_initial.py new file mode 100644 index 0000000..d097368 --- /dev/null +++ b/purchase/migrations/0001_initial.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('basedata', '0001_initial'), + ('selfhelp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Invoice', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('vo_date', models.DateField(blank=True, default=datetime.date.today, null=True, verbose_name='invoice date')), + ('code', models.CharField(max_length=20, verbose_name='invoice code')), + ('number', models.CharField(max_length=20, verbose_name='invoice number')), + ('po_amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='po amount')), + ('vo_amount', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='invoice amount')), + ('file', models.FileField(blank=True, null=True, upload_to=b'invoice', verbose_name='invoice file')), + ('partner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ], + options={ + 'verbose_name': 'Invoice', + 'verbose_name_plural': 'Invoice', + }, + ), + migrations.CreateModel( + name='Payment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('py_date', models.DateField(blank=True, default=datetime.date.today, null=True, verbose_name='pay date')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='pay code')), + ('po_amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='po amount')), + ('py_amount', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='pay amount')), + ('response_code', models.CharField(blank=True, max_length=80, null=True, verbose_name='response code')), + ('memo', models.TextField(blank=True, null=True, verbose_name='memo')), + ('bank', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.BankAccount', verbose_name='bank account')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ], + options={ + 'verbose_name': 'Payment', + 'verbose_name_plural': 'Payment', + }, + ), + migrations.CreateModel( + name='POItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('price', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True, verbose_name='price')), + ('cnt', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True, verbose_name='count')), + ('discount_price', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True, verbose_name='discount price')), + ('amount', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='money of amount')), + ('discount_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='discount amount')), + ('tax', models.CharField(default=b'0.00', max_length=6, verbose_name='tax rate')), + ('is_in_stock', models.BooleanField(default=0, verbose_name='is in stock')), + ('in_stock_time', models.DateTimeField(blank=True, null=True, verbose_name='execute time')), + ('entry_cnt', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True, verbose_name='entry count')), + ('left_cnt', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True, verbose_name='left count')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material')), + ('measure', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure')), + ], + options={ + 'verbose_name': 'po item', + 'verbose_name_plural': 'po item', + }, + ), + migrations.CreateModel( + name='PurchaseOrder', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('order_date', models.DateField(verbose_name='order date')), + ('arrive_date', models.DateField(verbose_name='arrive date')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'IN PROGRESS'), (b'4', 'DROP'), (b'9', 'APPROVED'), (b'99', 'ALREADY STOCK IN')], default=b'0', max_length=2, verbose_name='status')), + ('amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='money amount')), + ('discount_amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='discount amount')), + ('entry_status', models.BooleanField(default=0, verbose_name='entry status')), + ('entry_time', models.DateTimeField(blank=True, null=True, verbose_name='entry time')), + ('attach', models.FileField(blank=True, help_text='\u60a8\u53ef\u5bfc\u5165\u91c7\u8d2d\u660e\u7ec6\uff0c\u6a21\u677f\u8bf7\u53c2\u8003\u6587\u6863FD0008', null=True, upload_to=b'', verbose_name='attach')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'purchase order', + 'verbose_name_plural': 'purchase orders', + }, + ), + migrations.AddField( + model_name='poitem', + name='po', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='purchase.PurchaseOrder', verbose_name='purchase order'), + ), + migrations.AddField( + model_name='poitem', + name='woitem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WOItem', verbose_name='wo item'), + ), + migrations.AddField( + model_name='payment', + name='po', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='purchase.PurchaseOrder', verbose_name='purchase order'), + ), + migrations.AddField( + model_name='invoice', + name='po', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='purchase.PurchaseOrder', verbose_name='purchase order'), + ), + ] diff --git a/purchase/migrations/__init__.py b/purchase/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sale/migrations/0001_initial.py b/sale/migrations/0001_initial.py new file mode 100644 index 0000000..aa2f23a --- /dev/null +++ b/sale/migrations/0001_initial.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('basedata', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='OfferItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cnt', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='count')), + ('brand', models.CharField(blank=True, max_length=20, null=True, verbose_name='brand')), + ('cost_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='cost price')), + ('stock_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='stock price')), + ('sale_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='sale price')), + ('discount_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='discount price')), + ('tax', models.CharField(default=b'0.00', max_length=6, verbose_name='tax rate')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='create time')), + ('status', models.BooleanField(default=0, verbose_name='executed')), + ('event_time', models.DateTimeField(blank=True, null=True, verbose_name='event time')), + ], + options={ + 'verbose_name': 'offer detail', + 'verbose_name_plural': 'offer detail', + }, + ), + migrations.CreateModel( + name='OfferSheet', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('offer_date', models.DateField(verbose_name='offer date')), + ('deliver_date', models.DateField(verbose_name='deliver date')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='memo')), + ('amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='money amount')), + ('discount_amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='discount amount')), + ('attach', models.FileField(blank=True, help_text='\u60a8\u53ef\u5bfc\u5165\u62a5\u4ef7\u660e\u7ec6\uff0c\u6a21\u677f\u8bf7\u53c2\u8003\u6587\u6863FD0006', null=True, upload_to=b'offer sheet', verbose_name='offer sheet file')), + ('status', models.BooleanField(default=0, verbose_name='executed')), + ('event_time', models.DateTimeField(blank=True, null=True, verbose_name='event time')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='offer man')), + ], + options={ + 'verbose_name': 'offer sheet', + 'verbose_name_plural': 'offer sheet', + }, + ), + migrations.CreateModel( + name='PaymentCollection', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('collection_date', models.DateField(blank=True, default=datetime.date.today, null=True, verbose_name='collection date')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='collection code')), + ('order_amount', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='order amount')), + ('collection_amount', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='collection amount')), + ('memo', models.TextField(blank=True, null=True, verbose_name='memo')), + ('bank', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.BankAccount', verbose_name='bank account')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ], + options={ + 'verbose_name': 'Payment Collection', + 'verbose_name_plural': 'Payment Collection', + }, + ), + migrations.CreateModel( + name='SaleItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cnt', models.DecimalField(decimal_places=4, max_digits=14, verbose_name='count')), + ('stock_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='stock price')), + ('sale_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='sale price')), + ('discount_price', models.DecimalField(blank=True, decimal_places=4, max_digits=14, null=True, verbose_name='discount price')), + ('tax', models.CharField(default=b'0.00', max_length=6, verbose_name='tax rate')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='create time')), + ('status', models.BooleanField(default=0, verbose_name='executed')), + ('event_time', models.DateTimeField(blank=True, null=True, verbose_name='event time')), + ], + options={ + 'verbose_name': 'order detail', + 'verbose_name_plural': 'order detail', + }, + ), + migrations.CreateModel( + name='SaleOrder', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('order_date', models.DateField(verbose_name='order date')), + ('deliver_date', models.DateField(verbose_name='deliver date')), + ('title', models.CharField(max_length=40, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='memo')), + ('contact', models.CharField(blank=True, max_length=20, null=True, verbose_name='contacts')), + ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='phone')), + ('fax', models.CharField(blank=True, max_length=20, null=True, verbose_name='fax')), + ('deliver_address', models.CharField(blank=True, max_length=120, null=True, verbose_name='deliver address')), + ('invoice_type', models.CharField(default=b'10', max_length=6, verbose_name='invoice type')), + ('amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='money amount')), + ('discount_amount', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=12, null=True, verbose_name='discount amount')), + ('status', models.CharField(choices=[(b'0', 'NEW'), (b'1', 'IN PROGRESS'), (b'4', 'DROP'), (b'9', 'APPROVED'), (b'99', 'ALREADY STOCK OUT')], default=b'0', max_length=2, verbose_name='status')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.Organization', verbose_name='organization')), + ('partner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Partner', verbose_name='partner')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='sales man')), + ], + options={ + 'verbose_name': 'sale order', + 'verbose_name_plural': 'sale order', + }, + ), + migrations.AddField( + model_name='saleitem', + name='master', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sale.SaleOrder'), + ), + migrations.AddField( + model_name='saleitem', + name='material', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material'), + ), + migrations.AddField( + model_name='saleitem', + name='measure', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure'), + ), + migrations.AddField( + model_name='paymentcollection', + name='so', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sale.SaleOrder', verbose_name='sale order'), + ), + migrations.AddField( + model_name='offeritem', + name='master', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sale.OfferSheet'), + ), + migrations.AddField( + model_name='offeritem', + name='material', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material'), + ), + migrations.AddField( + model_name='offeritem', + name='measure', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure'), + ), + ] diff --git a/sale/migrations/__init__.py b/sale/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/selfhelp/migrations/0001_initial.py b/selfhelp/migrations/0001_initial.py new file mode 100644 index 0000000..6532812 --- /dev/null +++ b/selfhelp/migrations/0001_initial.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('basedata', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Activity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('begin_time', models.DateTimeField(verbose_name='begin time')), + ('end_time', models.DateTimeField(verbose_name='end time')), + ('enroll_deadline', models.DateTimeField(blank=True, null=True, verbose_name='enroll deadline')), + ('code', models.CharField(blank=True, max_length=20, null=True, verbose_name='code')), + ('title', models.CharField(max_length=120, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('host', models.CharField(blank=True, max_length=80, null=True, verbose_name='host')), + ('speaker', models.CharField(blank=True, max_length=80, null=True, verbose_name='speaker')), + ('accept_enroll', models.BooleanField(default=1, verbose_name='accept enroll')), + ('location', models.CharField(blank=True, max_length=80, null=True, verbose_name='location')), + ('classification', models.CharField(blank=True, choices=[(b'T', 'Train'), (b'M', 'Meeting'), (b'G', 'Community')], default=b'M', max_length=2, null=True, verbose_name='classification')), + ('mail_list', models.TextField(blank=True, null=True, verbose_name='mail list')), + ('mail_notice', models.BooleanField(default=1, verbose_name='mail notice')), + ('short_message_notice', models.BooleanField(default=1, verbose_name='short message notice')), + ('weixin_notice', models.BooleanField(default=1, verbose_name='weixin notice')), + ('status', models.BooleanField(default=0, verbose_name='published')), + ('publish_time', models.DateTimeField(blank=True, null=True, verbose_name='publish time')), + ('attach', models.FileField(blank=True, null=True, upload_to=b'activity', verbose_name='attach')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.Activity', verbose_name='parent')), + ('room', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='room')), + ], + options={ + 'verbose_name': 'activity', + 'verbose_name_plural': 'activities', + }, + ), + migrations.CreateModel( + name='Enroll', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('enroll_time', models.DateTimeField(auto_now_add=True, verbose_name='enroll time')), + ('activity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='selfhelp.Activity')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Feedback', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('feed_time', models.DateTimeField(auto_now_add=True, verbose_name='feedback time')), + ('rank', models.CharField(blank=True, choices=[(b'A', b'A'), (b'B', b'B'), (b'C', b'C'), (b'D', b'D')], default=b'B', max_length=2, null=True, verbose_name='rank')), + ('comment', models.CharField(blank=True, max_length=80, null=True, verbose_name='suggest')), + ('activity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='selfhelp.Activity')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Loan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=10, null=True, verbose_name='loan code')), + ('title', models.CharField(max_length=120, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('status', models.CharField(blank=True, choices=[(b'N', 'NEW'), (b'I', 'IN PROGRESS'), (b'A', 'APPROVED'), (b'P', 'PAYED')], default=b'N', max_length=2, null=True, verbose_name='status')), + ('logout_time', models.DateTimeField(blank=True, null=True, verbose_name='logout time')), + ('loan_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='loan amount')), + ('logout_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='logout amount')), + ('pay_user', models.CharField(blank=True, max_length=40, null=True, verbose_name='pay user')), + ('pay_time', models.DateTimeField(blank=True, null=True, verbose_name='pay time')), + ('is_clear', models.BooleanField(default=False, verbose_name='is clear')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Project', verbose_name='project')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'loan', + 'verbose_name_plural': 'loans', + 'permissions': (('financial_pay', 'financial pay'),), + }, + ), + migrations.CreateModel( + name='Reimbursement', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=10, null=True, verbose_name='fee code')), + ('title', models.CharField(max_length=120, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('bank_account', models.CharField(blank=True, max_length=120, null=True, verbose_name='bank account')), + ('status', models.CharField(blank=True, choices=[(b'N', 'NEW'), (b'I', 'IN PROGRESS'), (b'A', 'APPROVED'), (b'P', 'PAYED')], default=b'N', max_length=2, null=True, verbose_name='status')), + ('amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='amount of money')), + ('loan_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='loan amount')), + ('logout_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='logout amount')), + ('pay_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='pay amount')), + ('pay_time', models.DateTimeField(blank=True, null=True, verbose_name='pay time')), + ('pay_user', models.CharField(blank=True, max_length=40, null=True, verbose_name='pay user')), + ('loan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.Loan', verbose_name='loan record')), + ('org', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='organ.OrgUnit', verbose_name='cost center')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.Project', verbose_name='project')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'reimbursement', + 'verbose_name_plural': 'reimbursements', + 'permissions': (('financial_pay', 'financial pay'),), + }, + ), + migrations.CreateModel( + name='ReimbursementItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(default=datetime.date.today, verbose_name='occur date')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount of money')), + ('memo', models.CharField(blank=True, max_length=40, null=True, verbose_name='memo')), + ('expense_account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.ExpenseAccount', verbose_name='expenses account')), + ('reimbursement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='selfhelp.Reimbursement', verbose_name='reimbursement')), + ], + options={ + 'verbose_name': 'fee item', + 'verbose_name_plural': 'fee items', + }, + ), + migrations.CreateModel( + name='WOExtraValue', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('param_value', models.CharField(blank=True, max_length=40, null=True, verbose_name='param value')), + ('param_name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='basedata.ExtraParam', verbose_name='extra param')), + ], + options={ + 'verbose_name': 'extra value', + 'verbose_name_plural': 'extra values', + }, + ), + migrations.CreateModel( + name='WOItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='amount')), + ('price', models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='price')), + ('material', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='material')), + ('measure', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Measure', verbose_name='measure')), + ], + options={ + 'verbose_name': 'workorder item', + 'verbose_name_plural': 'workorder items', + }, + ), + migrations.CreateModel( + name='WorkOrder', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=10, null=True, verbose_name='workorder code')), + ('title', models.CharField(max_length=120, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('business_domain', models.CharField(default=b'OT', max_length=4, verbose_name='business domain')), + ('classification', models.CharField(default=b'D', max_length=4, verbose_name='classification')), + ('status', models.CharField(blank=True, default=b'NEW', max_length=6, null=True, verbose_name='status')), + ('answer', models.TextField(blank=True, null=True, verbose_name='answer')), + ('attach', models.FileField(blank=True, help_text='\u5de5\u5355\u9644\u4ef6\uff0c\u4e0d\u5bfc\u5165\u660e\u7ec6\u3002', null=True, upload_to=b'', verbose_name='attach')), + ('detail', models.FileField(blank=True, help_text='\u60a8\u53ef\u5bfc\u5165\u9700\u6c42\u660e\u7ec6\uff0c\u6a21\u677f\u8bf7\u53c2\u8003\u6587\u6863FD0007', null=True, upload_to=b'', verbose_name='to be imported detail')), + ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Project', verbose_name='project')), + ('refer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WorkOrder', verbose_name='refer wo')), + ('service', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='basedata.Material', verbose_name='service name')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'workorder apply', + 'verbose_name_plural': 'workorder apply', + }, + ), + migrations.AddField( + model_name='woitem', + name='workorder', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WorkOrder', verbose_name='workorder'), + ), + migrations.AddField( + model_name='woextravalue', + name='workorder', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WorkOrder', verbose_name='workorder'), + ), + migrations.AddField( + model_name='reimbursement', + name='wo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='selfhelp.WorkOrder', verbose_name='work order'), + ), + ] diff --git a/selfhelp/migrations/__init__.py b/selfhelp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/syscfg/migrations/0001_initial.py b/syscfg/migrations/0001_initial.py new file mode 100644 index 0000000..a9b9654 --- /dev/null +++ b/syscfg/migrations/0001_initial.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Menu', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='menu code')), + ('name', models.CharField(max_length=40, verbose_name='menu name')), + ('url', models.URLField(blank=True, max_length=80, null=True, verbose_name='menu url')), + ('weight', models.IntegerField(blank=True, default=99, null=True, verbose_name='weight')), + ('icon', models.CharField(blank=True, max_length=40, null=True, verbose_name='style class')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ], + options={ + 'verbose_name': 'menu', + 'verbose_name_plural': 'menu', + }, + ), + migrations.CreateModel( + name='Module', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='module code')), + ('name', models.CharField(max_length=40, verbose_name='module name')), + ('url', models.URLField(blank=True, max_length=80, null=True, verbose_name='module url')), + ('weight', models.IntegerField(blank=True, default=99, null=True, verbose_name='weight')), + ('icon', models.CharField(blank=True, max_length=40, null=True, verbose_name='style class')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='syscfg.Module', verbose_name='parent')), + ], + options={ + 'verbose_name': 'module', + 'verbose_name_plural': 'module', + }, + ), + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('creator', models.CharField(blank=True, max_length=20, null=True, verbose_name='creator')), + ('modifier', models.CharField(blank=True, max_length=20, null=True, verbose_name='modifier')), + ('creation', models.DateTimeField(auto_now_add=True, null=True, verbose_name='creation')), + ('modification', models.DateTimeField(auto_now=True, null=True, verbose_name='modification')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='role code')), + ('name', models.CharField(max_length=40, verbose_name='role name')), + ('description', models.CharField(blank=True, max_length=80, null=True, verbose_name='description')), + ('status', models.BooleanField(default=True, verbose_name='in use')), + ('menus', models.ManyToManyField(blank=True, to='syscfg.Menu', verbose_name='role menus')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='syscfg.Role', verbose_name='parent')), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='role users')), + ], + options={ + 'verbose_name': 'role', + 'verbose_name_plural': 'role', + }, + ), + migrations.CreateModel( + name='Site', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begin', models.DateField(blank=True, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, null=True, verbose_name='end date')), + ('name', models.CharField(max_length=40, verbose_name='site name')), + ('description', models.TextField(blank=True, null=True, verbose_name='site description')), + ('user', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='administrator')), + ], + options={ + 'verbose_name': 'Site', + 'verbose_name_plural': 'Site', + }, + ), + migrations.AddField( + model_name='menu', + name='module', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='syscfg.Module', verbose_name='module'), + ), + ] diff --git a/syscfg/migrations/__init__.py b/syscfg/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/workflow/migrations/0001_initial.py b/workflow/migrations/0001_initial.py new file mode 100644 index 0000000..385b894 --- /dev/null +++ b/workflow/migrations/0001_initial.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-06-13 20:58 +from __future__ import unicode_literals + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organ', '0001_initial'), + ('syscfg', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='History', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pro_time', models.DateTimeField(auto_now_add=True, verbose_name='process time')), + ('pro_type', models.IntegerField(choices=[(0, 'SUBMIT'), (1, 'AGREE'), (3, 'DENY'), (4, 'TERMINATE')], default=0, verbose_name='process type')), + ('memo', models.CharField(blank=True, max_length=40, null=True, verbose_name='memo')), + ], + options={ + 'ordering': ['inst', 'pro_time'], + 'verbose_name': 'workflow history', + 'verbose_name_plural': 'workflow history', + }, + ), + migrations.CreateModel( + name='Instance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=10, null=True, verbose_name='code')), + ('object_id', models.PositiveIntegerField(verbose_name=b'object id')), + ('start_time', models.DateTimeField(auto_now_add=True, verbose_name='start time')), + ('approved_time', models.DateTimeField(blank=True, null=True, verbose_name='approved time')), + ('status', models.IntegerField(choices=[(1, 'NEW'), (2, 'IN PROGRESS'), (3, 'DENY'), (4, 'TERMINATED'), (9, 'APPROVED'), (99, 'COMPLETED')], default=1, verbose_name='status')), + ], + options={ + 'verbose_name': 'workflow instance', + 'verbose_name_plural': 'workflow instance', + }, + ), + migrations.CreateModel( + name='Modal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=6, null=True, verbose_name='workflow code')), + ('name', models.CharField(max_length=40, verbose_name='workflow name')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('app_name', models.CharField(blank=True, max_length=60, null=True, verbose_name='app name')), + ('model_name', models.CharField(blank=True, max_length=60, null=True, verbose_name='model name')), + ('begin', models.DateField(blank=True, default=datetime.date.today, null=True, verbose_name='begin date')), + ('end', models.DateField(blank=True, default=datetime.date(9999, 12, 31), null=True, verbose_name='end date')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='content type')), + ], + options={ + 'verbose_name': 'workflow model', + 'verbose_name_plural': 'workflow model', + }, + ), + migrations.CreateModel( + name='Node', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=4, null=True, verbose_name='node code')), + ('name', models.CharField(max_length=80, verbose_name='node name')), + ('tooltip', models.CharField(blank=True, max_length=120, null=True, verbose_name='tooltip words')), + ('start', models.BooleanField(default=False, verbose_name='start node')), + ('stop', models.BooleanField(default=False, verbose_name='stop node')), + ('can_terminate', models.BooleanField(default=False, verbose_name='can terminate')), + ('can_deny', models.BooleanField(default=True, verbose_name='can deny')), + ('can_edit', models.BooleanField(default=False, verbose_name='can edit')), + ('email_notice', models.BooleanField(default=True, verbose_name='email notice')), + ('short_message_notice', models.BooleanField(default=False, verbose_name='short message notice')), + ('approve_node', models.BooleanField(default=False, verbose_name='approve node')), + ('handler', models.TextField(blank=True, help_text='\u81ea\u5b9a\u4e49SQL\u8bed\u53e5\uff0c\u4f18\u5148\u9ad8\u4e8e\u6307\u5b9a\u7528\u6237\u3001\u5c97\u4f4d\u3001\u89d2\u8272', null=True, verbose_name='handler')), + ('handler_type', models.IntegerField(choices=[(1, 'designated user'), (2, 'designated position'), (3, 'designated role'), (4, 'submitter')], default=1, verbose_name='handler type')), + ('next_user_handler', models.CharField(blank=True, max_length=40, null=True, verbose_name='next user handler')), + ('next_node_handler', models.CharField(blank=True, max_length=40, null=True, verbose_name='next node handler')), + ('status_field', models.CharField(blank=True, max_length=40, null=True, verbose_name='status field')), + ('status_value', models.CharField(blank=True, max_length=40, null=True, verbose_name='status value')), + ('action', models.CharField(blank=True, max_length=40, null=True, verbose_name='execute action')), + ('departments', models.ManyToManyField(blank=True, to='organ.OrgUnit', verbose_name='designated department')), + ('modal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workflow.Modal', verbose_name='workflow model')), + ('next', models.ManyToManyField(blank=True, to='workflow.Node', verbose_name='next node')), + ('positions', models.ManyToManyField(blank=True, to='organ.Position', verbose_name='designated position')), + ('roles', models.ManyToManyField(blank=True, to='syscfg.Role', verbose_name='designated role')), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='designated user')), + ], + options={ + 'verbose_name': 'workflow node', + 'verbose_name_plural': 'workflow node', + }, + ), + migrations.CreateModel( + name='TodoList', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=10, null=True, verbose_name='code')), + ('app_name', models.CharField(blank=True, max_length=60, null=True, verbose_name='app name')), + ('model_name', models.CharField(blank=True, max_length=60, null=True, verbose_name='model name')), + ('arrived_time', models.DateTimeField(auto_now_add=True, verbose_name='arrived time')), + ('is_read', models.BooleanField(default=False, verbose_name='is read')), + ('read_time', models.DateTimeField(blank=True, null=True, verbose_name='read time')), + ('status', models.BooleanField(default=False, verbose_name='is done')), + ('inst', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workflow.Instance', verbose_name='workflow instance')), + ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflow.Node', verbose_name='current node')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='handler')), + ], + options={ + 'ordering': ['user', '-arrived_time'], + 'verbose_name': 'workflow todo', + 'verbose_name_plural': 'workflow todo', + }, + ), + migrations.AddField( + model_name='instance', + name='current_nodes', + field=models.ManyToManyField(blank=True, to='workflow.Node', verbose_name='current node'), + ), + migrations.AddField( + model_name='instance', + name='modal', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workflow.Modal', verbose_name='workflow model'), + ), + migrations.AddField( + model_name='instance', + name='starter', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='starter', to=settings.AUTH_USER_MODEL, verbose_name='start user'), + ), + migrations.AddField( + model_name='history', + name='inst', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workflow.Instance', verbose_name='workflow instance'), + ), + migrations.AddField( + model_name='history', + name='node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflow.Node', verbose_name='workflow node'), + ), + migrations.AddField( + model_name='history', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='submitter'), + ), + ] diff --git a/workflow/migrations/__init__.py b/workflow/migrations/__init__.py new file mode 100644 index 0000000..e69de29 From 5bdf70df9d26edb8885b98eeb22df6c1fddc9bd3 Mon Sep 17 00:00:00 2001 From: AngelLiang Date: Sat, 13 Jun 2020 21:01:27 +0800 Subject: [PATCH 06/65] Added .flake8 --- .flake8 | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..41dd444 --- /dev/null +++ b/.flake8 @@ -0,0 +1,6 @@ +[flake8] +exclude = .git,*migrations,*venv* +max-line-length = 120 + +# ignore module level import not at top of file +ignore = E402 From 7f405d81946bb1d229d0859f5acbf57de0dd3a6c Mon Sep 17 00:00:00 2001 From: AngelLiang Date: Sat, 13 Jun 2020 21:17:11 +0800 Subject: [PATCH 07/65] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../invent/initialinventory/change_form.html | 167 ++++++++++++++++++ .../admin/invent/inventory/change_form.html | 2 +- .../admin/invent/stockin/change_form.html | 7 +- .../admin/invent/stockout/change_form.html | 2 +- .../admin/invent/wareadjust/change_form.html | 148 ++++++++++++++++ .../admin/invent/warereturn/change_form.html | 148 ++++++++++++++++ templates/admin/submit_line.html | 11 +- 7 files changed, 478 insertions(+), 7 deletions(-) create mode 100644 templates/admin/invent/initialinventory/change_form.html create mode 100644 templates/admin/invent/wareadjust/change_form.html create mode 100644 templates/admin/invent/warereturn/change_form.html diff --git a/templates/admin/invent/initialinventory/change_form.html b/templates/admin/invent/initialinventory/change_form.html new file mode 100644 index 0000000..27b1a4e --- /dev/null +++ b/templates/admin/invent/initialinventory/change_form.html @@ -0,0 +1,167 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls admin_static admin_modify %} + +{% block extrahead %}{{ block.super }} + +{{ media }} +{% endblock %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colM{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block content %}
+{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} +
{% csrf_token %}{% block form_top %}{% endblock %} +
+{% if is_popup %}{% endif %} +{% if to_field %}{% endif %} +{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} +{% if show_workflow_line%} +
+

{% trans "workflow approve" %}

+
+ {% if can_restart %} + {% trans "restart workflow" %} +

{% trans "your apply has been denied,you can restart a new apply" %}

+ {% else %} + + + + {% trans "submit" %} + {% endif %} +
+
+{% endif %} +{% if errors %} +

+ {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

+ {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} +{% endblock %} + +{% block after_field_sets %}{% endblock %} + +{% block inline_field_sets %} +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} +{% endblock %} + +{% block after_related_objects %}{% endblock %} + +{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + +{% block admin_change_form_document_ready %} + +{% endblock %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
+
+{% if detail %} +

{% trans "InOut History" %}

+
+ + + + + + + + + + + + + + {% for item in detail %} + + + + + + + + + + {% endfor %} + + +
{% trans 'execute time' %}{% trans 'plus or minus prop' %}{% trans 'price' %}{% trans 'count' %}{% trans 'measure' %}{% trans 'status' %}{% trans 'source' %}
{{ item.event_time|date:"DATETIME_FORMAT" }}{{ item.prop }}{{ item.price }}{{ item.cnt }}{{ item.measure }}{% if item.status %} {% trans 'EXECUTED'%} {% endif %}{{ item.source }}
+
+{% endif %} +{% endblock %} diff --git a/templates/admin/invent/inventory/change_form.html b/templates/admin/invent/inventory/change_form.html index a6e147e..a5f742b 100644 --- a/templates/admin/invent/inventory/change_form.html +++ b/templates/admin/invent/inventory/change_form.html @@ -114,7 +114,7 @@

{% trans "workflow approve" %}

{% endif %} {% if extra_buttons %} {% for button in extra_buttons %} - $("{{button.title}}").insertAfter("#workflow_submit"); + $("{{button.title}}").insertAfter("#workflow_submit"); {% endfor %} {% endif %} {% if readonly %} diff --git a/templates/admin/invent/stockin/change_form.html b/templates/admin/invent/stockin/change_form.html index 453b691..97362e6 100644 --- a/templates/admin/invent/stockin/change_form.html +++ b/templates/admin/invent/stockin/change_form.html @@ -100,6 +100,7 @@

{% trans "workflow approve" %}

{% if adminform and add %} $('form#{{ opts.model_name }}_form :input:visible:enabled:first').focus() {% endif %} + // 工作流按钮 {% if workflow_modal %} {% if workflow_instance %} workflow_modal = "{{ workflow_modal.code }}"; @@ -113,11 +114,15 @@

{% trans "workflow approve" %}

{% else %} $("#workflow_submit").hide(); {% endif %} + + // 额外的按钮 {% if extra_buttons %} {% for button in extra_buttons %} - $("{{button.title}}").insertAfter("#workflow_submit"); + $("{{button.title}}").insertAfter("#workflow_submit"); {% endfor %} {% endif %} + + // 原始按钮 {% if readonly %} $('input,select').attr('disabled',true); $('div.submit-row').hide(); diff --git a/templates/admin/invent/stockout/change_form.html b/templates/admin/invent/stockout/change_form.html index 3e8227e..20c61e9 100644 --- a/templates/admin/invent/stockout/change_form.html +++ b/templates/admin/invent/stockout/change_form.html @@ -115,7 +115,7 @@

{% trans "workflow approve" %}

{% endif %} {% if extra_buttons %} {% for button in extra_buttons %} - $("{{button.title}}").insertAfter("#workflow_submit"); + $("{{button.title}}").insertAfter("#workflow_submit"); {% endfor %} {% endif %} {% if readonly %} diff --git a/templates/admin/invent/wareadjust/change_form.html b/templates/admin/invent/wareadjust/change_form.html new file mode 100644 index 0000000..df74b91 --- /dev/null +++ b/templates/admin/invent/wareadjust/change_form.html @@ -0,0 +1,148 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls admin_static admin_modify %} + +{% block extrahead %}{{ block.super }} + +{{ media }} +{% endblock %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colM{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block content %}
+{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} +
{% csrf_token %}{% block form_top %}{% endblock %} +
+{% if is_popup %}{% endif %} +{% if to_field %}{% endif %} +{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} +{% if show_workflow_line%} +
+

{% trans "workflow approve" %}

+
+ {% if can_restart %} + {% trans "restart workflow" %} +

{% trans "your apply has been denied,you can restart a new apply" %}

+ {% else %} + + + + {% trans "submit" %} + {% endif %} +
+
+{% endif %} +{% if errors %} +

+ {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

+ {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} +{% endblock %} + +{% block after_field_sets %}{% endblock %} + +{% block inline_field_sets %} +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} +{% endblock %} + +{% block after_related_objects %}{% endblock %} + +{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + +{% block admin_change_form_document_ready %} + +{% endblock %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
+
+{% endblock %} diff --git a/templates/admin/invent/warereturn/change_form.html b/templates/admin/invent/warereturn/change_form.html new file mode 100644 index 0000000..ddcb90f --- /dev/null +++ b/templates/admin/invent/warereturn/change_form.html @@ -0,0 +1,148 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls admin_static admin_modify %} + +{% block extrahead %}{{ block.super }} + +{{ media }} +{% endblock %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colM{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block content %}
+{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} +
{% csrf_token %}{% block form_top %}{% endblock %} +
+{% if is_popup %}{% endif %} +{% if to_field %}{% endif %} +{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} +{% if show_workflow_line%} +
+

{% trans "workflow approve" %}

+
+ {% if can_restart %} + {% trans "restart workflow" %} +

{% trans "your apply has been denied,you can restart a new apply" %}

+ {% else %} + + + + {% trans "submit" %} + {% endif %} +
+
+{% endif %} +{% if errors %} +

+ {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

+ {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} +{% endblock %} + +{% block after_field_sets %}{% endblock %} + +{% block inline_field_sets %} +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} +{% endblock %} + +{% block after_related_objects %}{% endblock %} + +{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + +{% block admin_change_form_document_ready %} + +{% endblock %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
+
+{% endblock %} diff --git a/templates/admin/submit_line.html b/templates/admin/submit_line.html index 9ae7940..0323fc5 100644 --- a/templates/admin/submit_line.html +++ b/templates/admin/submit_line.html @@ -3,10 +3,13 @@ {% if show_save %}{% endif %} {% trans "submit" %} - {% for button in extra_buttons %} -{{button.title}} - {% endfor %} - {{extra_buttons}} + + + + + {% if show_delete_link %} {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} +{% endblock %} +{% endif %} + +{% block content %}
+{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} +
{% csrf_token %}{% block form_top %}{% endblock %} +
+{% if is_popup %}{% endif %} +{% if to_field %}{% endif %} +{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} +{% if show_workflow_line%} +
+

{% trans "workflow approve" %}

+
+ {% if can_restart %} + {% trans "restart workflow" %} +

{% trans "your apply has been denied,you can restart a new apply" %}

+ {% else %} + + + + {% trans "submit" %} + {% endif %} +
+
+{% endif %} +{% if errors %} +

+ {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

+ {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} +{% endblock %} + +{% block after_field_sets %}{% endblock %} + +{% block inline_field_sets %} +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} +{% endblock %} + +{% block after_related_objects %}{% endblock %} + +{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + +{% block admin_change_form_document_ready %} + +{% endblock %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
+
+{% endblock %} From 02204f73567382264e51e30f65a2473953f63f13 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 16:32:03 +0800 Subject: [PATCH 15/65] Updated .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 04655ca..3168b16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.sqlite3 .vscode/ .venv/ +upload/ From 196cd3b4bf3e7621b6351e98b078ac3213a21d72 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:02:48 +0800 Subject: [PATCH 16/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/basedata/models.py b/basedata/models.py index a526384..c4bb4d4 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -20,27 +20,35 @@ class ValueList(generic.BO): """ index_weight = 9 + # 编号 code = models.CharField( _("list code"), max_length=const.DB_CHAR_CODE_6, blank=True, null=True) + # 名称 name = models.CharField(_("list name"), max_length=const.DB_CHAR_NAME_40) + # 模块 module = models.ForeignKey( Module, verbose_name=_("module"), blank=True, null=True, on_delete=models.CASCADE) + # 状态 - 是否在用 status = models.BooleanField(_("in use"), default=True) + # 是否是初始数据 init = models.BooleanField(_("is init"), default=False) + # 是否锁定 locked = models.BooleanField(_("is locked"), default=False) + # 锁定用户 locked_by = models.ForeignKey( User, verbose_name=_("locked by"), blank=True, null=True, on_delete=models.CASCADE) + # 锁定日期时间 lock_time = models.DateTimeField(_("locked time"), null=True, blank=True) def save(self, force_insert=False, force_update=False, using=None, @@ -663,6 +671,7 @@ class Material(generic.BO): null=True, verbose_name=_("category"), on_delete=models.CASCADE) + # 物料性质 - Material type tp = models.CharField( _('mt type'), blank=True, From 12de9acbbb599c25e8568796eb0226357929c328 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:04:44 +0800 Subject: [PATCH 17/65] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index c4bb4d4..24ddaaf 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -51,15 +51,8 @@ class ValueList(generic.BO): # 锁定日期时间 lock_time = models.DateTimeField(_("locked time"), null=True, blank=True) - def save(self, force_insert=False, force_update=False, using=None, - update_fields=None): - super( - ValueList, - self).save( - force_insert, - force_update, - using, - update_fields) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + super(ValueList, self).save(force_insert, force_update, using, update_fields) sql = 'update basedata_valuelistitem set group_code = %s where groud_id=%s' params = [self.code, self.id] generic.update(sql, params) @@ -91,19 +84,12 @@ class ValueListItem(ToStringMixin, models.Model): status = models.BooleanField(_("in use"), default=True) weight = models.IntegerField(_("weight"), null=True, default=9) - def save(self, force_insert=False, force_update=False, using=None, - update_fields=None): + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if not self.code: cnt = self.group.valuelistitem_set.count() + 1 self.code = "%02d" % cnt self.group_code = self.group.code - super( - ValueListItem, - self).save( - force_insert, - force_update, - using, - update_fields) + super(ValueListItem, self).save(force_insert, force_update, using, update_fields) def __unicode__(self): return "%s-%s" % (self.code, self.name) From 8521865bb204571ec072949bf02b630a1570c379 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:15:17 +0800 Subject: [PATCH 18/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 12 +++++++++--- common/generic.py | 8 +++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index 24ddaaf..77fe581 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -53,6 +53,7 @@ class ValueList(generic.BO): def save(self, force_insert=False, force_update=False, using=None, update_fields=None): super(ValueList, self).save(force_insert, force_update, using, update_fields) + # 同时更新 ValueListItem 模型数据的 group_code 数值 sql = 'update basedata_valuelistitem set group_code = %s where groud_id=%s' params = [self.code, self.id] generic.update(sql, params) @@ -75,13 +76,17 @@ class ValueListItem(ToStringMixin, models.Model): max_length=const.DB_CHAR_CODE_6, blank=True, null=True) + # 编号 code = models.CharField( _("item code"), max_length=const.DB_CHAR_CODE_6, blank=True, null=True) + # 名称 name = models.CharField(_("item name"), max_length=const.DB_CHAR_NAME_40) + # 是否在用? status = models.BooleanField(_("in use"), default=True) + # 排序权重 weight = models.IntegerField(_("weight"), null=True, default=9) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -102,10 +107,11 @@ class Meta: def get_value_list(group): - """ + """获取选项值的列表 + + :param group: str - :param group: - :return: + :return: list or None """ from django.db.utils import OperationalError if group: diff --git a/common/generic.py b/common/generic.py index 45d64a1..b20c1fc 100644 --- a/common/generic.py +++ b/common/generic.py @@ -21,9 +21,11 @@ def update(sql, params=None): - """ - :param sql: - :param params: + """ 执行SQL + + :param sql: str, SQL语句 + :param params: list,参数 + :return: """ cursor = connection.cursor() From 3ca186b21e81447ad1faffba878d0c57b2f23ce7 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:16:46 +0800 Subject: [PATCH 19/65] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E4=BF=AE=E8=A1=A5bug=E4=BA=A7=E7=94=9F=E7=9A=84=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=EF=BC=8C=E7=8E=B0=E5=9C=A8=E4=B8=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/basedata/models.py b/basedata/models.py index 77fe581..36aec98 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -113,7 +113,6 @@ def get_value_list(group): :return: list or None """ - from django.db.utils import OperationalError if group: try: return tuple([(item.code, item.name) for item in ValueListItem.objects.filter( From 1cf7547c9639d851b057236ccde409255430757b Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:30:00 +0800 Subject: [PATCH 20/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/admin.py | 6 ++++++ basedata/models.py | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/basedata/admin.py b/basedata/admin.py index 95e3539..a256857 100644 --- a/basedata/admin.py +++ b/basedata/admin.py @@ -23,6 +23,8 @@ def get_extra(self, request, obj=None, **kwargs): class ValueListAdmin(generic.BOAdmin): + """值列表""" + CODE_NUMBER_WIDTH = 3 CODE_PREFIX = 'S' list_display = ['code', 'name', 'module', 'status'] @@ -35,6 +37,8 @@ class ValueListAdmin(generic.BOAdmin): def save_model(self, request, obj, form, change): super(ValueListAdmin, self).save_model(request, obj, form, change) + # 更新 值列表选项 的 group_code 属性 + # 似乎与 ValueList.save() 覆写的方法功能重复了 obj.valuelistitem_set.update(group_code=obj.code) @@ -353,6 +357,8 @@ def get_readonly_fields(self, request, obj=None): class DataImportAdmin(generic.BOAdmin): + """数据导入""" + list_display = ['imp_date', 'title', 'status'] list_display_links = ['imp_date', 'title'] raw_id_fields = ['content_type'] diff --git a/basedata/models.py b/basedata/models.py index 36aec98..1413535 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -90,6 +90,7 @@ class ValueListItem(ToStringMixin, models.Model): weight = models.IntegerField(_("weight"), null=True, default=9) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + # 如果编号没赋值 if not self.code: cnt = self.group.valuelistitem_set.count() + 1 self.code = "%02d" % cnt @@ -115,8 +116,11 @@ def get_value_list(group): """ if group: try: - return tuple([(item.code, item.name) for item in ValueListItem.objects.filter( - group_code__exact=group, status=1)]) + # exact: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#exact + return tuple([ + (item.code, item.name) for item in ValueListItem.objects.filter( + group_code__exact=group, status=1) + ]) except Exception: return None else: From c90a3cd86e845ef06b296305325372d176fb7a31 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 17:50:19 +0800 Subject: [PATCH 21/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/generic.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/common/generic.py b/common/generic.py index b20c1fc..81943c2 100644 --- a/common/generic.py +++ b/common/generic.py @@ -119,8 +119,11 @@ class BOAdmin(admin.ModelAdmin): """ All business object admin derive from this class """ + # 编码长度 CODE_NUMBER_WIDTH = 4 + # 编码前缀 CODE_PREFIX = '9' + # 额外的按钮 extra_buttons = [] exclude = ['creator', 'modifier', 'creation', 'modification', 'begin', 'end'] @@ -197,7 +200,7 @@ def changeform_view(self, request, object_id=None, form_url='', extra_context=No return super(BOAdmin, self).changeform_view(request, object_id, form_url, extra_context) def history_view(self, request, object_id, extra_context=None): - """ + """ 历史记录视图 :param request: :param object_id: @@ -243,8 +246,10 @@ def get_changeform_initial_data(self, request): def save_model(self, request, obj, form, change): if change: + # 修改时更新以下信息 setattr(obj, 'modifier', request.user.username) else: + # 创建时更新以下信息 setattr(obj, 'creator', request.user.username) setattr(obj, 'begin', datetime.date.today()) setattr(obj, 'end', datetime.date(9999, 12, 31)) @@ -255,6 +260,8 @@ def save_model(self, request, obj, form, change): super(BOAdmin, self).save_model(request, obj, form, change) # print '=========it is here=========' + + # 更新 obj.code try: code = getattr(obj, 'code') # print code @@ -265,12 +272,14 @@ def save_model(self, request, obj, form, change): sql = 'update %s set code = \'%s\' where id=%s' % (table, code, obj.id) update(sql) except Exception: + # 如果没有 code 字段则会进入异常分支 pass # def response_change(self, request, obj): # return HttpResponseRedirect('') def export_selected_data(self, request, queryset): + """导出所选的数据""" ops = self.model._meta workbook = xlwt.Workbook(encoding='utf-8') dd = datetime.date.today().strftime('%Y%m%d') @@ -326,8 +335,10 @@ def export_selected_data(self, request, queryset): export_selected_data.short_description = _("export selected %(verbose_name_plural)s") class Meta: + # 默认按创建时间降序排序 ordering = ['-creation'] class Media: + # 额外的前端静态文件? css = {'all': ('css/maximus.css',)} js = ('js/maximus.js',) From 07a570ad3f478013ca66232a81a3f30b021abbce Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Mon, 15 Jun 2020 18:00:44 +0800 Subject: [PATCH 22/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/generic.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/common/generic.py b/common/generic.py index 81943c2..30e8ad5 100644 --- a/common/generic.py +++ b/common/generic.py @@ -40,18 +40,23 @@ def update(sql, params=None): def get_app_model_info_from_request(request): - """ + """ 从请求中获取app模型信息 + + :param request: django.http.HttpRequest + :return: dict or None """ if request and isinstance(request, HttpRequest): import re + # 匹配请求路径 pattern = re.compile(r"/(admin)/(\w+)/(\w+)/(\d+)") match = pattern.match(request.path) if match and match.group(): - app = match.group(2) - model = match.group(3) - oid = match.group(4) + app = match.group(2) # 第2个括号? + model = match.group(3) # 第3个括号? + oid = match.group(4) # 第4个括号? + # 获取 ContentType 对象 ct = ContentType.objects.get(app_label=app, model=model) obj = ct.get_object_for_this_type(id=oid) return {'app': app, 'model': model, 'id': oid, 'obj': obj} @@ -131,7 +136,7 @@ class BOAdmin(admin.ModelAdmin): actions = ['export_selected_data'] def changeform_view(self, request, object_id=None, form_url='', extra_context=None): - """ + """修改表单视图 :param request: :param object_id: @@ -240,6 +245,10 @@ def history_view(self, request, object_id, extra_context=None): return super(BOAdmin, self).history_view(request, object_id, extra_context) def get_changeform_initial_data(self, request): + """获取修改表单的初始数据 + + https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_changeform_initial_data + """ import datetime return {'begin': datetime.date.today, 'end': datetime.date(9999, 12, 31)} From 8061b85a483e1a723419ac1ea388149e908a0684 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 09:28:28 +0800 Subject: [PATCH 23/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/generic.py | 2 ++ midware/cuser.py | 3 +++ mis/settings.py | 1 + 3 files changed, 6 insertions(+) diff --git a/common/generic.py b/common/generic.py index 30e8ad5..a99f897 100644 --- a/common/generic.py +++ b/common/generic.py @@ -69,6 +69,7 @@ class MineBOManager(models.Manager): """ def get_query_set(self): + # cuser.getuser(): 获取当前用户 return super(MineBOManager, self).get_query_set().filter(creator=cuser.getuser()) @@ -107,6 +108,7 @@ class BO(ToStringMixin, models.Model): creation = models.DateTimeField(_('creation'), auto_now_add=True, blank=True, null=True) # 修改datetime modification = models.DateTimeField(_('modification'), auto_now=True, blank=True, null=True) + # mine = MineBOManager() objects = models.Manager() diff --git a/midware/cuser.py b/midware/cuser.py index a85c35f..55df8b9 100644 --- a/midware/cuser.py +++ b/midware/cuser.py @@ -36,6 +36,7 @@ def getuser(): class RequestUser(MiddlewareMixin): + """当前用户中间件""" def process_request(self, request): django_user = getattr(request, 'user', None) @@ -186,6 +187,8 @@ def process_view(self, request, view_func, view_args, view_kwargs): view_kwargs['extra_context'] = context def get_my_task(self, request): + """获取我的任务""" + from workflow.models import TodoList if request and request.user: query = TodoList.objects.filter(user=request.user, status=0) diff --git a/mis/settings.py b/mis/settings.py index a3f3b4c..33be4ab 100644 --- a/mis/settings.py +++ b/mis/settings.py @@ -57,6 +57,7 @@ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', + # 添加自定义的获取请求用户中间件 'midware.cuser.RequestUser', ) MIDDLEWARE = MIDDLEWARE_CLASSES From 33207f101fb954978cf535e510dc80ce6bef2eff Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 10:59:10 +0800 Subject: [PATCH 24/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=92=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/generic.py | 7 ++++++- organ/models.py | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/common/generic.py b/common/generic.py index a99f897..7cbefd9 100644 --- a/common/generic.py +++ b/common/generic.py @@ -126,7 +126,7 @@ class BOAdmin(admin.ModelAdmin): """ All business object admin derive from this class """ - # 编码长度 + # 编码的数字长度 CODE_NUMBER_WIDTH = 4 # 编码前缀 CODE_PREFIX = '9' @@ -277,10 +277,15 @@ def save_model(self, request, obj, form, change): code = getattr(obj, 'code') # print code if code is None or len(code) == 0: + # 生成格式化 fmt = '%s%0' + str(self.CODE_NUMBER_WIDTH) + 'd' + # 生成code,这里需要获取obj的id code = fmt % (self.CODE_PREFIX, obj.id) + # 获取数据表名称 table = obj._meta.db_table + # 生成SQL sql = 'update %s set code = \'%s\' where id=%s' % (table, code, obj.id) + # 执行SQL update(sql) except Exception: # 如果没有 code 字段则会进入异常分支 diff --git a/organ/models.py b/organ/models.py index 97cbe4d..dfa7cfe 100644 --- a/organ/models.py +++ b/organ/models.py @@ -8,13 +8,18 @@ class Organization(generic.BO): """ - 组织单位 + 组织机构 """ index_weight = 1 + # 组织编号 code = models.CharField(_("organ code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 组织名称 name = models.CharField(_("organ name"), max_length=const.DB_CHAR_NAME_120) + # 简称 short = models.CharField(_("short name"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 拼音 pinyin = models.CharField(_("pinyin"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True) + # 是否在用? status = models.BooleanField(_("in use"), default=True) tax_num = models.CharField(_("tax num"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) @@ -55,17 +60,29 @@ class OrgUnit(generic.BO): parent = models.ForeignKey('self', verbose_name=_("parent"), null=True, blank=True, on_delete=models.CASCADE) organization = models.ForeignKey(Organization, verbose_name=_('organization'), null=True, blank=True, on_delete=models.CASCADE) + # 编号 code = models.CharField(_("code"), max_length=const.DB_CHAR_CODE_8, blank=True, null=True) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120) + # 简称 short = models.CharField(_("short name"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 拼音/英文 pinyin = models.CharField(_("pinyin"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True) + # 单元类型 unit_type = models.IntegerField(_("type"), choices=UNIT_LEVEL, default=2) + # 状态:是否在用 status = models.BooleanField(_("in use"), default=True) + # 是否虚拟 virtual = models.BooleanField(_("is virtual"), default=False) + # 传真 fax = models.CharField(_("fax"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 联系电话 phone = models.CharField(_("phone"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 联系人 contacts = models.CharField(_("contacts"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 邮箱 email = models.CharField(_("email"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 排序权重 weight = models.IntegerField(_("weight"), default=99) class Meta: @@ -92,25 +109,40 @@ class Position(generic.BO): ('05', _("EXPERT")), ) index_weight = 3 + # 关联的组织单元 unit = models.ForeignKey(OrgUnit, verbose_name=_('org unit'), on_delete=models.CASCADE) + # 关联的组织机构 organization = models.ForeignKey(Organization, verbose_name=_('organization'), null=True, blank=True, on_delete=models.CASCADE) + # 父级 parent = models.ForeignKey('self', verbose_name=_("parent"), null=True, blank=True, on_delete=models.CASCADE) + # 编号 code = models.CharField(_("position code"), max_length=const.DB_CHAR_CODE_8, blank=True, null=True) + # 岗位名称 name = models.CharField(_("position name"), max_length=const.DB_CHAR_NAME_120) + # 简称 short = models.CharField(_("short name"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 拼音/英文 pinyin = models.CharField(_("pinyin"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True) + # 岗位序列 series = models.CharField(_("position series"), max_length=1, default='A', choices=const.get_value_list('S014')) + # 岗位级别 grade = models.CharField( _("position grade"), max_length=const.DB_CHAR_CODE_2, default='01', choices=const.get_value_list('S015')) + # 是否虚拟 virtual = models.BooleanField(_("is virtual"), default=False) + # 状态:是否在用 status = models.BooleanField(_("in use"), default=True) + # 岗位说明 description = models.TextField(_("position description"), blank=True, null=True) + # 任职资格 qualification = models.TextField(_("qualification"), blank=True, null=True) + # 参考资料 document = models.FileField(_("reference"), blank=True, null=True) + # 排序权重 weight = models.IntegerField(_("weight"), default=99) def __unicode__(self): From 9d2eb597d1290f38dede62b7ce6309bf11c92510 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 11:46:26 +0800 Subject: [PATCH 25/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- organ/models.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/organ/models.py b/organ/models.py index dfa7cfe..720de65 100644 --- a/organ/models.py +++ b/organ/models.py @@ -22,22 +22,38 @@ class Organization(generic.BO): # 是否在用? status = models.BooleanField(_("in use"), default=True) + # 纳税识别号 tax_num = models.CharField(_("tax num"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 开票地址/电话 tax_address = models.CharField(_("tax address"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 发票开户行 tax_account = models.CharField(_("tax account"), max_length=const.DB_CHAR_NAME_80, blank=True, null=True) + # 法人代表 represent = models.CharField(_("representative "), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 地址 address = models.CharField(_("address"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True) + # 邮编 zipcode = models.CharField(_("zipcode"), max_length=const.DB_CHAR_CODE_8, blank=True, null=True) + # 传真 fax = models.CharField(_("fax"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 联系人 contacts = models.CharField(_("contacts"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 联系电话 phone = models.CharField(_("phone"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 网址 website = models.CharField(_("website"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 邮箱 email = models.CharField(_("email"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 营业执照代码 lic_code = models.CharField(_("license code"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 组织机构代码 cer_code = models.CharField(_("certificate code"), max_length=const.DB_CHAR_NAME_40, blank=True, null=True) + # 营业执照证书 license = models.FileField(_("business license"), blank=True, null=True, upload_to='organ') + # 组织结构证书 certificate = models.FileField(_("organization code certificate"), blank=True, null=True, upload_to='organ') + # 排序权重 weight = models.IntegerField(_("weight"), default=9) class Meta: From 35b7733c66f7e356205ec44436fc72840ca91dc4 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 14:02:58 +0800 Subject: [PATCH 26/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 10 +++++++++ invent/models.py | 54 ++++++++++++++++++++++++++++++++++++++-------- purchase/models.py | 2 +- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index 1413535..cddef2c 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -667,6 +667,15 @@ class Material(generic.BO): verbose_name=_("category"), on_delete=models.CASCADE) # 物料性质 - Material type + # 10: 生产物料 + # 11: 办公用品 + # 20: 建筑物/培训室 + # 30: 员工宿舍 + # 40: 工卡/饭卡 + # 50: 车辆 + # 60: 图书 + # 70: 工位 + # 80: 工单服务 tp = models.CharField( _('mt type'), blank=True, @@ -719,6 +728,7 @@ class Material(generic.BO): decimal_places=4, blank=True, null=True) + # 所属组织机构 org = models.ForeignKey( Organization, verbose_name=_("organization"), diff --git a/invent/models.py b/invent/models.py index 464da9d..d98af43 100644 --- a/invent/models.py +++ b/invent/models.py @@ -22,10 +22,15 @@ class Inventory(generic.BO): 库存信息 """ index_weight = 1 + # 所属组织机构 org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 仓库 warehouse = models.ForeignKey(Warehouse, verbose_name=_("warehouse"), on_delete=models.CASCADE) + # 物料 material = models.ForeignKey(Material, verbose_name=_("material"), on_delete=models.CASCADE) + # 计量单位 measure = models.ForeignKey(Measure, verbose_name=_("measure"), on_delete=models.CASCADE) + # 数量 cnt = models.DecimalField(_("count"), max_digits=14, decimal_places=4) batch = models.CharField(_("batch"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) price = models.DecimalField(_("price"), max_digits=14, decimal_places=4) @@ -49,11 +54,15 @@ class InitialInventory(generic.BO): ('9', _("EXECUTED")) ) index_weight = 9 + # 编号 code = models.CharField(_("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 所属组织 org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 标题 title = models.CharField(_("title"), max_length=const.DB_CHAR_NAME_40) user = models.ForeignKey(User, verbose_name=_("user"), blank=True, null=True, on_delete=models.CASCADE) status = models.CharField(_("status"), max_length=const.DB_CHAR_CODE_2, default='0', choices=STATUS) + # 执行时间 execute_time = models.DateTimeField(_("execute time"), blank=True, null=True) attach = models.FileField(_('attach'), blank=True, null=True, upload_to='inventory', help_text=u'参考FD0002模板文档') amount = models.DecimalField(_('money of amount'), max_digits=14, decimal_places=4, blank=True, null=True) @@ -145,13 +154,19 @@ class StockIn(generic.BO): ('9', _("EXECUTED")) ) index_weight = 3 + # 编号 code = models.CharField(_("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 所属组织机构 org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 仓库 warehouse = models.ForeignKey(Warehouse, verbose_name=_("warehouse"), on_delete=models.CASCADE) + # 标题 title = models.CharField(_("title"), max_length=const.DB_CHAR_NAME_40) user = models.ForeignKey(User, verbose_name=_("user"), blank=True, null=True, on_delete=models.CASCADE) status = models.CharField(_("status"), max_length=const.DB_CHAR_CODE_2, default='0', choices=STATUS) + # 执行时间 execute_time = models.DateTimeField(_("execute time"), blank=True, null=True) + # 关联的采购单 po = models.ForeignKey( PurchaseOrder, verbose_name=_("purchase order"), @@ -248,9 +263,11 @@ class StockOut(generic.BO): index_weight = 2 code = models.CharField(_("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 标题 title = models.CharField(_("title"), max_length=const.DB_CHAR_NAME_40) project = models.ForeignKey(Project, verbose_name=_("project"), blank=True, null=True, on_delete=models.CASCADE) wo = models.ForeignKey(WorkOrder, verbose_name=_("work order"), blank=True, null=True, on_delete=models.CASCADE) + # 描述 description = models.TextField(_("description"), blank=True, null=True) amount = models.DecimalField(_("money of amount"), max_digits=14, decimal_places=4, blank=True, null=True) user = models.ForeignKey(User, verbose_name=_("out user"), blank=True, null=True, on_delete=models.CASCADE) @@ -301,18 +318,21 @@ class WareReturn(generic.BO): 返库单 """ STATUS = ( - ('0', _("NEW")), - ('1', _("IN PROGRESS")), - ('9', _("EXECUTED")) + ('0', _("NEW")), # 新建 + ('1', _("IN PROGRESS")), # 在处理 + ('9', _("EXECUTED")) # 已执行 ) index_weight = 5 code = models.CharField(_("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 标题 title = models.CharField(_("title"), max_length=const.DB_CHAR_NAME_40) + # 关联的出库单 out = models.ForeignKey(StockOut, verbose_name=_('StockOut'), on_delete=models.CASCADE) amount = models.DecimalField(_("money of amount"), max_digits=14, decimal_places=4, blank=True, null=True) user = models.ForeignKey(User, verbose_name=_("out user"), blank=True, null=True, on_delete=models.CASCADE) status = models.CharField(_("status"), max_length=const.DB_CHAR_CODE_2, default='0', choices=STATUS) + # 执行时间 execute_time = models.DateTimeField(_("execute time"), blank=True, null=True) def save(self, force_insert=False, force_update=False, using=None, @@ -366,13 +386,17 @@ class WareAdjust(generic.BO): index_weight = 4 code = models.CharField(_("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) org = models.ForeignKey(Organization, verbose_name=_("organization"), blank=True, null=True, on_delete=models.CASCADE) + # 标题 title = models.CharField(_("title"), max_length=const.DB_CHAR_NAME_40) + # 描述 description = models.TextField(_("description"), blank=True, null=True) user = models.ForeignKey(User, verbose_name=_("out user"), blank=True, null=True, on_delete=models.CASCADE) status = models.CharField(_("status"), max_length=const.DB_CHAR_CODE_2, default='0', choices=STATUS) + # 执行时间 execute_time = models.DateTimeField(_("execute time"), blank=True, null=True) def action_adjust(self, request): + """执行库存调整""" with transaction.atomic(): for item in AdjustItem.objects.filter(master=self, status=0): inventory = item.inventory @@ -396,7 +420,7 @@ class Meta: class InOutDetail(models.Model): """ - in out detail + 出入库详单 """ PROP = ( @@ -404,21 +428,27 @@ class InOutDetail(models.Model): ('-', _("MINUS")) ) + # 创建时间 create_time = models.DateTimeField(_("create time"), auto_now_add=True) status = models.BooleanField(_("executed"), default=0) event_time = models.DateTimeField(_("event time"), blank=True, null=True) + # 仓库 warehouse = models.ForeignKey(Warehouse, verbose_name=_("warehouse"), blank=True, null=True, on_delete=models.CASCADE) + # 物料 material = models.ForeignKey( Material, verbose_name=_("material"), limit_choices_to={ - "is_virtual": "0"}, + "is_virtual": "0"}, # 排除了虚拟物料 blank=True, null=True, on_delete=models.CASCADE) + # 计量单位 measure = models.ForeignKey(Measure, verbose_name=_("measure"), blank=True, null=True, on_delete=models.CASCADE) + # 数量 cnt = models.DecimalField(_("count"), max_digits=14, decimal_places=4, blank=True, null=True) batch = models.CharField(_("batch"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 单价? price = models.DecimalField(_("price"), max_digits=14, decimal_places=4, blank=True, null=True) prop = models.CharField(_("plus or minus property"), max_length=const.DB_CHAR_CODE_2, choices=PROP, default='+') source = models.CharField(_("source"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) @@ -437,9 +467,11 @@ class Meta: class InItem(InOutDetail): """ - 入库单明细 + 入库单明细行,继承 InOutDetail 类 """ + # 关联入库单 master = models.ForeignKey(StockIn, on_delete=models.CASCADE) + # 关联采购单明细行 po_item = models.ForeignKey(POItem, verbose_name=_("po item"), blank=True, null=True, on_delete=models.CASCADE) def get_new_price(self): @@ -470,8 +502,9 @@ class Meta: class OutItem(InOutDetail): """ - 出库单明细 + 出库单明细行,继承 InOutDetail 类 """ + # 关联出库单 master = models.ForeignKey(StockOut, on_delete=models.CASCADE) inventory = models.ForeignKey( Inventory, @@ -497,9 +530,11 @@ class Meta: class ReturnItem(InOutDetail): """ - 返库单明细 + 返库单明细行,继承 InOutDetail 类 """ + # 关联返库单 master = models.ForeignKey(WareReturn, on_delete=models.CASCADE) + # 关联出库单明细行 out_item = models.ForeignKey(OutItem, blank=True, null=True, verbose_name=_('out item'), on_delete=models.CASCADE) out_cnt = models.DecimalField(_("out count"), max_digits=14, decimal_places=4) @@ -510,8 +545,9 @@ class Meta: class AdjustItem(InOutDetail): """ - 库存调整明细 + 库存调整明细行 """ + # 关联库存调整单 master = models.ForeignKey(WareAdjust, on_delete=models.CASCADE) inventory = models.ForeignKey( Inventory, diff --git a/purchase/models.py b/purchase/models.py index 3912409..4d7424c 100644 --- a/purchase/models.py +++ b/purchase/models.py @@ -123,7 +123,7 @@ class Meta: class POItem(models.Model): """ - + 采购单明细行 """ index_weight = 2 po = models.ForeignKey(PurchaseOrder, verbose_name=_("purchase order"), on_delete=models.CASCADE) From e1ead31f2ad5077a00c13ca0334c7eef1d595508 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 14:21:59 +0800 Subject: [PATCH 27/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 8 +++++++- workflow/models.py | 31 ++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index cddef2c..1844364 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -281,24 +281,30 @@ class Meta: class BankAccount(generic.BO): """ - 银行账户 organization + 银行账户 """ + # 银行帐号 account = models.CharField( _("account num"), max_length=const.DB_CHAR_NAME_40) + # 银行名称 title = models.CharField(_("bank name"), max_length=const.DB_CHAR_NAME_40) + # 备注 memo = models.CharField( _("memo"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + + # 合作伙伴 partner = models.ForeignKey( Partner, verbose_name=_("partner"), blank=True, null=True, on_delete=models.CASCADE) + # 所属组织 org = models.ForeignKey( Organization, verbose_name=_("organization"), diff --git a/workflow/models.py b/workflow/models.py index 8f91100..d93ed62 100644 --- a/workflow/models.py +++ b/workflow/models.py @@ -16,8 +16,11 @@ class Modal(ToStringMixin, models.Model): """ import datetime index_weight = 1 + # 工作流编号 code = models.CharField(_("workflow code"), max_length=const.DB_CHAR_CODE_6, blank=True, null=True) + # 工作流名称 name = models.CharField(_("workflow name"), max_length=const.DB_CHAR_NAME_40) + # 描述 description = models.TextField(_("description"), blank=True, null=True) content_type = models.ForeignKey( ContentType, @@ -30,7 +33,9 @@ class Modal(ToStringMixin, models.Model): app_name = models.CharField(_("app name"), max_length=const.DB_CHAR_NAME_60, blank=True, null=True) model_name = models.CharField(_("model name"), max_length=const.DB_CHAR_NAME_60, blank=True, null=True) # added by zhugl 2015-05-10 + # 开始时间 begin = models.DateField(_("begin date"), blank=True, null=True, default=datetime.date.today) + # 结束时时间 end = models.DateField(_("end date"), blank=True, null=True, default=datetime.date(9999, 12, 31)) def __unicode__(self): @@ -51,11 +56,12 @@ class Node(ToStringMixin, models.Model): sql() etc:upper('zhangsan','lisi') """ + # 处理类型 HANDLER_TYPE = ( - (1, _("designated user")), - (2, _("designated position")), - (3, _("designated role")), - (4, _("submitter")), + (1, _("designated user")), # 指定用户 + (2, _("designated position")), # 指定岗位 + (3, _("designated role")), # 指定角色 + (4, _("submitter")), # 提交人 ) index_weight = 2 modal = models.ForeignKey(Modal, verbose_name=_("workflow model"), on_delete=models.CASCADE) @@ -63,21 +69,32 @@ class Node(ToStringMixin, models.Model): name = models.CharField(_("node name"), max_length=const.DB_CHAR_NAME_80) tooltip = models.CharField(_('tooltip words'), blank=True, null=True, max_length=const.DB_CHAR_NAME_120) + # 起始节点 start = models.BooleanField(_("start node"), default=False) + # 结束节点 stop = models.BooleanField(_("stop node"), default=False) + # 允许终止 can_terminate = models.BooleanField(_("can terminate"), default=False) + # 允许拒绝 can_deny = models.BooleanField(_("can deny"), default=True) + # 允许编辑 can_edit = models.BooleanField(_("can edit"), default=False) + # 邮件通知 email_notice = models.BooleanField(_("email notice"), default=True) + # 短信通知 short_message_notice = models.BooleanField(_("short message notice"), default=False) + # 批准节点 approve_node = models.BooleanField(_("approve node"), default=False) handler = models.TextField(_("handler"), blank=True, null=True, help_text=u'自定义SQL语句,优先高于指定用户、岗位、角色') # added by zhugl 2015-05-10 handler_type = models.IntegerField(_("handler type"), choices=HANDLER_TYPE, default=1) positions = models.ManyToManyField(Position, verbose_name=_("designated position"), blank=True) + # 角色 多对多 roles = models.ManyToManyField(Role, verbose_name=_("designated role"), blank=True) + # 用户 多对多 users = models.ManyToManyField(User, verbose_name=_("designated user"), blank=True) + # 组织单元 多对多 departments = models.ManyToManyField(OrgUnit, verbose_name=_("designated department"), blank=True) next = models.ManyToManyField('self', blank=True, verbose_name=_("next node"), symmetrical=False) # added by zhugl 2015-06-30 @@ -104,7 +121,7 @@ class Meta: class Instance(ToStringMixin, models.Model): """ - + 工作流实例 """ STATUS = ( (1, _("NEW")), @@ -118,10 +135,14 @@ class Instance(ToStringMixin, models.Model): code = models.CharField(_("code"), blank=True, null=True, max_length=const.DB_CHAR_CODE_10) modal = models.ForeignKey(Modal, verbose_name=_("workflow model"), on_delete=models.CASCADE) object_id = models.PositiveIntegerField("object id") + # 发起人 starter = models.ForeignKey(User, verbose_name=_("start user"), related_name="starter", on_delete=models.CASCADE) + # 发起时间 start_time = models.DateTimeField(_("start time"), auto_now_add=True) + # 批准时间 approved_time = models.DateTimeField(_("approved time"), blank=True, null=True) status = models.IntegerField(_("status"), default=1, choices=STATUS) + # 当前节点 多对多 current_nodes = models.ManyToManyField(Node, verbose_name=_("current node"), blank=True) def __unicode__(self): From b39be1c94f952dc521479227577bfb9300f78988 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 14:59:03 +0800 Subject: [PATCH 28/65] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basedata/models.py | 50 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/basedata/models.py b/basedata/models.py index 1844364..c4fe49e 100644 --- a/basedata/models.py +++ b/basedata/models.py @@ -466,11 +466,13 @@ class Measure(ToStringMixin, models.Model): 计量单位 """ index_weight = 5 + # 编号 code = models.CharField( _("code"), max_length=const.DB_CHAR_CODE_6, blank=True, null=True) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_20) status = models.BooleanField(_("in use"), default=True) @@ -487,13 +489,17 @@ class Trade(ToStringMixin, models.Model): 国民经济行业分类 """ index_weight = 102 + # 编号 code = models.CharField(_("code"), max_length=const.DB_CHAR_CODE_6) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120) + # 备注 memo = models.CharField( _("memo"), max_length=const.DB_CHAR_NAME_120, null=True, blank=True) + # 父级 parent = models.ForeignKey( 'self', verbose_name=_("parent"), @@ -515,18 +521,22 @@ class Brand(ToStringMixin, models.Model): 品牌 """ index_weight = 101 + # 经济行业 trade = models.ForeignKey( Trade, verbose_name=_("trade"), null=True, blank=True, on_delete=models.CASCADE) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120) + # 拼音/英语 pinyin = models.CharField( _("pinyin"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True) + # 排序权重 weight = models.IntegerField( _("weight"), blank=True, @@ -547,24 +557,29 @@ class Category(ToStringMixin, models.Model): """ index_weight = 100 + # 经济行业 trade = models.ForeignKey( Trade, verbose_name=_("trade"), null=True, blank=True, on_delete=models.CASCADE) + # 父级 parent = models.ForeignKey( 'self', verbose_name=_("parent"), null=True, blank=True, on_delete=models.CASCADE) + # 编号 code = models.CharField( _("code"), max_length=const.DB_CHAR_CODE_6, null=True, blank=True) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120) + # 路径(?) path = models.CharField( _("path"), max_length=const.DB_CHAR_NAME_200, @@ -819,20 +834,23 @@ class ExpenseAccount(generic.BO): """ CATEGORY = ( - ('HR', _('HR-DOMAIN')), - ('OF', _('OFFICE-DOMAIN')), - ('PU', _('PUBLIS-DOMAIN')), - ('MU', _('MUNADOMAIN')), - ('BU', _('BUSINESS')), - ('OT', _('OTHER')), + ('HR', _('HR-DOMAIN')), # 人事费用 + ('OF', _('OFFICE-DOMAIN')), # 行政办公 + ('PU', _('PUBLIS-DOMAIN')), # 运营公共 + ('MU', _('MUNADOMAIN')), # 生产制造 + ('BU', _('BUSINESS')), # 市场商务 + ('OT', _('OTHER')), # 其他 ) index_weight = 10 + # 编号 code = models.CharField( _("code"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 名称 name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120) + # 分类 category = models.CharField( _("category"), max_length=const.DB_CHAR_CODE_4, @@ -845,7 +863,9 @@ class ExpenseAccount(generic.BO): null=True, blank=True, on_delete=models.CASCADE) + # 在用? status = models.BooleanField(_("in use"), default=True) + # 所属组织机构 org = models.ForeignKey( Organization, verbose_name=_("organization"), @@ -877,6 +897,7 @@ class Employee(generic.BO): max_length=const.DB_CHAR_NAME_20, blank=True, null=True) + # 所属组织机构 organization = models.ForeignKey( Organization, verbose_name=_('organization'), @@ -896,6 +917,7 @@ class Employee(generic.BO): # 生日 birthday = models.DateField(_("birthday"), blank=True, null=True) + # 性别 gender = models.CharField( _("gender"), max_length=const.DB_CHAR_CODE_2, @@ -947,6 +969,7 @@ class Employee(generic.BO): blank=True, null=True) + # 职位 position = models.ForeignKey( Position, verbose_name=_('position'), @@ -1139,7 +1162,7 @@ class Family(generic.BO): name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_60) # 出生日期 birthday = models.DateField(_("birthday"), blank=True, null=True) - # 组织机构 + # 所属组织机构 organization = models.CharField( _("organization"), max_length=const.DB_CHAR_NAME_120, @@ -1151,8 +1174,9 @@ class Family(generic.BO): max_length=const.DB_CHAR_NAME_120, blank=True, null=True) - # 紧急联系人 + # 是否是紧急联系人 emergency = models.BooleanField(_("emergency"), default=False) + # 关联的职员 employee = models.ForeignKey( Employee, verbose_name=_("employee"), @@ -1332,12 +1356,12 @@ class Document(generic.BO): """ TP = ( - ('00', _('SYSTEM MANUAL')), - ('10', _('BUSINESS DOC')), + ('00', _('SYSTEM MANUAL')), # 系统文档 + ('10', _('BUSINESS DOC')), # 业务文档 ) STATUS = ( - ('0', _('draft')), - ('1', _('published')) + ('0', _('draft')), # 草稿 + ('1', _('published')) # 已发布 ) index_weight = 8 # 编号 @@ -1356,6 +1380,7 @@ class Document(generic.BO): null=True) # 描述信息 description = models.TextField(_('description'), blank=True, null=True) + # 类型 tp = models.CharField( _('type'), max_length=const.DB_CHAR_CODE_2, @@ -1381,6 +1406,7 @@ class Document(generic.BO): choices=STATUS) # 发布时间 pub_date = models.DateTimeField(_('publish date'), blank=True, null=True) + # 文件大小(?) size = models.CharField( _('size'), max_length=const.DB_CHAR_NAME_20, From e24096086dec8e8552762c8915e283873de41898 Mon Sep 17 00:00:00 2001 From: E7EE477C11C98D403F318118733EAA5C Date: Tue, 16 Jun 2020 15:01:17 +0800 Subject: [PATCH 29/65] =?UTF-8?q?=E7=BB=99=E6=A8=A1=E6=9D=BF=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/admin/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/admin/index.html b/templates/admin/index.html index 2228672..f273047 100644 --- a/templates/admin/index.html +++ b/templates/admin/index.html @@ -9,6 +9,7 @@ {% block bodyclass %}{{ block.super }} dashboard{% endblock %} +{% comment %} 导航栏 {% endcomment %} {% block breadcrumbs %} {% endblock %} +{% comment %} 重写了侧边栏 {% endcomment %} {% block sidebar %}