chore: re-initialize git repository for deployment

This commit is contained in:
yi
2026-06-10 14:01:56 +08:00
commit 7783e965fd
131 changed files with 14355 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
default_app_config = 'basedata.apps.BaseDataConfig'
+339
View File
@@ -0,0 +1,339 @@
# coding=utf-8
from django.contrib import admin
from django.forms import models
from django.forms import fields,TextInput,Textarea
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
from django.contrib.contenttypes.admin import GenericTabularInline
from common import generic
from basedata.models import ValueList,ValueListItem,Address,Partner,BankAccount,Project,Measure,Material,Brand,\
Category,Warehouse,TechnicalParameterName,TechnicalParameterValue,Trade,ExpenseAccount,Employee,Family,Education,\
WorkExperience,ExtraParam,DataImport,Document
class ValueListItemInline(admin.TabularInline):
model = ValueListItem
exclude = ['group_code']
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 3
class ValueListAdmin(generic.BOAdmin):
CODE_NUMBER_WIDTH = 3
CODE_PREFIX = 'S'
list_display = ['code', 'name', 'module', 'status']
fields = (('code',),('name',),('module',),('status','init','locked',),('locked_by','lock_time',))
raw_id_fields = ['module']
readonly_fields = ['locked_by','lock_time']
inlines = [ValueListItemInline]
search_fields = ['code','name']
def save_model(self, request, obj, form, change):
super(ValueListAdmin,self).save_model(request,obj,form,change)
obj.valuelistitem_set.update(group_code=obj.code)
class AddressAdmin(generic.BOAdmin):
list_display = ['address','phone','contacts']
exclude = ['content_type','object_id','creator','modifier','creation','modification','begin','end']
class AddressInline(GenericTabularInline):
model = Address
exclude = ['content_type','object_id','creator','modifier','creation','modification','begin','end']
extra = 1
class BankAccountInline(admin.TabularInline):
model = BankAccount
fields = ['account','title','memo']
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 1
class PartnerForm(models.ModelForm):
tax_address = fields.CharField(widget=TextInput(attrs={'size': 119,}),required=False,label=_("tax address"))
memo = fields.CharField(widget=Textarea(attrs={'rows':3,'cols':85}),required=False,label=_("memo"))
class Meta:
model = Partner
fields = '__all__'
class PartnerAdmin(generic.BOAdmin):
list_display = ['code','name','partner_type','level']
list_display_links = ['code','name']
fields = (('code','name',),('short','pinyin',),('partner_type','level'),('tax_num','tax_account',),
('tax_address',),('contacts','phone',),('memo',),)
search_fields = ['code','name','pinyin']
form = PartnerForm
save_on_top = True
inlines = [AddressInline,BankAccountInline]
def get_queryset(self, request):
if request.user.is_superuser or (request.user.has_perm('basedate.view_all_customer') and request.user.has_perm('basedate.view_all_supplier')):
return super(PartnerAdmin,self).get_queryset(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')
class ProjectForm(models.ModelForm):
income = fields.DecimalField(required=False,widget=TextInput(attrs={'readonly':'true'}))
expand = fields.DecimalField(required=False,widget=TextInput(attrs={'readonly':'true'}))
class Meta:
model = Project
fields = '__all__'
class ProjectAdmin(generic.BOAdmin):
CODE_PREFIX = 'PJ'
list_display = ['code','name','status','income','expand']
list_display_links = ['code','name']
fields = (
('code','name',),('short','pinyin',),
('partner',),('status','prj_type',),
('description',),
('budget','income','expand',),('blueprint',),('offer',),('business',),('users',),
)
search_fields = ['code','name']
readonly_fields = ['status']
raw_id_fields = ['partner']
filter_horizontal = ['users']
form = ProjectForm
class WarehouseAdmin(admin.ModelAdmin):
list_display = ['code','name','location']
filter_horizontal = ['users']
def save_model(self, request, obj, form, change):
super(WarehouseAdmin,self).save_model(request,obj,form,change)
try:
code = getattr(obj,'code')
if not code:
obj.code = '%s%02d' % ('A',obj.id)
obj.save()
except Exception,e:
self.message_user(request,'ERROR:%s' % e,level=messages.ERROR)
class BrandAdmin(admin.ModelAdmin):
list_display = ['name','pinyin']
class MeasureAdmin(admin.ModelAdmin):
list_display = ['code','name','status']
class CategoryAdmin(admin.ModelAdmin):
list_display = ['code','name','path']
def save_model(self, request, obj, form, change):
super(CategoryAdmin,self).save_model(request,obj,form,change)
try:
code = getattr(obj,'code')
if not code:
obj.code = '%s%02d' % ('F',obj.id)
obj.save()
if obj.parent:
if obj.parent.path:
obj.path = obj.parent.path + '/'+obj.parent.name
else:
obj.path = obj.parent.name
obj.save()
except Exception,e:
self.message_user(request,'ERROR:%s' % e,level=messages.ERROR)
class MaterialForm(models.ModelForm):
name = fields.CharField(widget=TextInput(attrs={"size":"119"}),label=_("material name"))
spec = fields.CharField(widget=TextInput(attrs={"size":"119"}),required=False,label=_("specifications"))
class Mata:
model = Material
fields = '__all__'
class ExtraParamInline(admin.TabularInline):
model = ExtraParam
fields = ['name','data_type','data_source']
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 1
class MaterialAdmin(generic.BOAdmin):
CODE_PREFIX = 'IT'
CODE_NUMBER_WIDTH = 5
list_display = ['code','name','spec','tp']
list_display_links = ['code','name']
list_filter = ['brand','tp']
search_fields = ['code','name']
fields = (
('code','barcode'),('name',),('spec',),
('brand',),('category',),('status','is_equip','can_sale','is_virtual',),
('warehouse',),('tp',),('measure',),('stock_price','purchase_price','sale_price',),
)
filter_horizontal = ['measure']
inlines = [ExtraParamInline]
form = MaterialForm
class TechParamValueInline(admin.TabularInline):
model = TechnicalParameterValue
class TechParamNameAdmin(admin.ModelAdmin):
list_display = ['name','category']
inlines = [TechParamValueInline]
class TradeAdmin(admin.ModelAdmin):
list_display = ['code','name','parent']
class ExpenseAdmin(generic.BOAdmin):
CODE_PREFIX = 'FC'
list_display = ['code','name','category']
list_display_links = ['code','name']
list_filter = ['category']
search_fields = ['name']
class FamilyForm(models.ModelForm):
name = fields.CharField(widget=TextInput(attrs={"size":"25"}),label=_("name"))
phone = fields.CharField(widget=TextInput(attrs={"size":"25"}),label=_("phone"))
class Meta:
model = Family
fields = '__all__'
class FamilyInline(admin.TabularInline):
model = Family
exclude = ['creator','modifier','creation','modification','begin','end']
form = FamilyForm
extra = 1
class EducationInline(admin.TabularInline):
model = Education
exclude = ['creator','modifier','creation','modification']
extra = 0
class WorkExperienceInline(admin.TabularInline):
model = WorkExperience
exclude = ['creator','modifier','creation','modification']
extra = 1
class EmployeeAdmin(generic.BOAdmin):
CODE_PREFIX = '1'
list_display = ['code','name','position','gender','idcard','age','work_age','literacy','phone','email']
search_fields = ['code','name','idcard','pinyin']
fieldsets = [
(None,{'fields':[('code','phone',),('name','pinyin',),('gender','birthday',),('idcard','country',),
('position',),('rank','category'),('status','ygxs',),('workday','startday',)]}),
(_('other info'),{'fields':[('hometown','address',),('banknum','bankname',),('email','office',),
('emergency','literacy',),('religion','marital',),('party','nation',),('spjob','health',),
('major','degree',),('tag1','tag2',),('tag3','tag4',),('user',),],'classes':['collapse']}),
]
readonly_fields = ['status','ygxs','rank','category']
inlines = [FamilyInline,EducationInline,WorkExperienceInline]
raw_id_fields = ['user']
def get_queryset(self, request):
if request.user.is_superuser or request.user.has_perm('basedata.view_all_employee'):
return super(EmployeeAdmin,self).get_queryset(request)
else:
return super(EmployeeAdmin,self).get_queryset(request).filter(user=request.user)
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return []
else:
return ['status','ygxs','rank','category','position','user']
class DataImportAdmin(generic.BOAdmin):
list_display = ['imp_date','title','status']
list_display_links = ['imp_date','title']
raw_id_fields = ['content_type']
readonly_fields = ['status']
extra_buttons = [{'href':'action','title':_('import')}]
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
if object_id:
obj = DataImport.objects.get(id=object_id)
if obj.status == '1':
extra_context = extra_context or {}
extra_context.update(dict(readonly=True))
return super(DataImportAdmin,self).changeform_view(request,object_id,form_url,extra_context)
class DocumentForm(models.ModelForm):
title = fields.CharField(widget=TextInput(attrs={"size":"119"}),label=_("title"))
keywords = fields.CharField(widget=TextInput(attrs={"size":"119"}),label=_("keywords"))
class Meta:
model = Document
fields = '__all__'
class DocumentAdmin(generic.BOAdmin):
CODE_PREFIX = 'FD'
CODE_NUMBER_WIDTH = 4
list_display = ['code','title','keywords','tp','business_domain','status','creation']
list_display_links = ['code','title']
fields = (('code','status',),('title',),('keywords',),('description',),('business_domain','tp',),('attach',))
readonly_fields = ['status']
list_filter = ['tp','business_domain']
search_fields = ['title','keywords','code']
form = DocumentForm
actions = ['publish']
date_hierarchy = 'begin'
def get_readonly_fields(self, request, obj=None):
if obj and obj.status=='1':
return ['code','status','title','keywords','description','business_domain','tp','attach',]
else:
return ['status']
def publish(self,request,queryset):
import datetime
cnt = queryset.filter(status='0').update(status='1',pub_date=datetime.datetime.now())
self.message_user(request,u'%s 个文档发布成功'%cnt)
publish.short_description = _('publish selected %(verbose_name_plural)s')
# admin.site.register(Address,AddressAdmin)
admin.site.register(ValueList,ValueListAdmin)
admin.site.register(Partner,PartnerAdmin)
admin.site.register(Project,ProjectAdmin)
admin.site.register(Material,MaterialAdmin)
admin.site.register(Warehouse,WarehouseAdmin)
admin.site.register(Brand,BrandAdmin)
admin.site.register(Measure,MeasureAdmin)
admin.site.register(Category,CategoryAdmin)
admin.site.register(TechnicalParameterName,TechParamNameAdmin)
admin.site.register(Trade,TradeAdmin)
admin.site.register(ExpenseAccount,ExpenseAdmin)
admin.site.register(Employee,EmployeeAdmin)
admin.site.register(DataImport,DataImportAdmin)
admin.site.register(Document,DocumentAdmin)
+9
View File
@@ -0,0 +1,9 @@
__author__ = 'zhugl'
# created at 15-4-22
from django.apps.config import AppConfig
from django.utils.translation import ugettext_lazy as _
class BaseDataConfig(AppConfig):
name = 'basedata'
verbose_name = _('BaseData')
+657
View File
@@ -0,0 +1,657 @@
# coding=utf-8
from django.db import models
from django.contrib.auth.models import User
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 common import const
from common import generic
from syscfg.models import Module,Site
from organ.models import Organization,Position
import datetime
from plugin.xls import ExcelManager
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)
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)
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)
sql = 'update basedata_valuelistitem set group_code = %s where groud_id=%s'
params = [self.code,self.id]
generic.update(sql,params)
class Meta:
verbose_name = _('value list')
verbose_name_plural = _('value list')
class ValueListItem(models.Model):
"""
值列表项
"""
group = models.ForeignKey(ValueList,verbose_name=_("list group"))
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)
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):
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)
def __unicode__(self):
return "%s-%s" % (self.code,self.name)
class Meta:
verbose_name = _('list item')
verbose_name_plural = _('list item')
ordering = ['weight','code']
index_together = ['group','group_code']
def get_value_list(group):
"""
:param group:
:return:
"""
if group:
return tuple([(item.code, item.name) for item in ValueListItem.objects.filter(group_code__exact=group,status=1)])
else:
return None
class Address(generic.BO):
"""
地址
"""
ADDRESS_TYPE = get_value_list('S011')
address_type = models.CharField(_("address type"),max_length=const.DB_CHAR_CODE_2,choices=ADDRESS_TYPE,default='01')
address = models.CharField(_("address"),max_length=const.DB_CHAR_NAME_120)
zipcode = models.CharField(_("zipcode"),max_length=const.DB_CHAR_CODE_8,blank=True,null=True)
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)
object_id = models.PositiveIntegerField(blank=True,null=True)
content_object = GenericForeignKey('content_type', 'object_id')
class Meta:
verbose_name = _('address')
verbose_name_plural = _('address')
class Partner(generic.BO):
"""
合作伙伴
"""
index_weight = 3
PARTNER_TYPE = (
('C', _('Customer')),
('S', _('Supplier')),
)
LEVEL = (
('A','A'),
('B','B'),
('C','C'),
('D','D'),
)
org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True)
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)
pinyin = models.CharField(_("pinyin"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True)
partner_type = models.CharField(_("type"),max_length=const.DB_CHAR_CODE_2,choices=PARTNER_TYPE,default='C')
level = models.CharField(_("level"),max_length=const.DB_CHAR_CODE_2,choices=LEVEL,default='C')
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)
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)
memo = models.TextField(_("memo"),blank=True,null=True)
class Meta:
verbose_name = _('partner')
verbose_name_plural = _('partner')
permissions = (
('view_all_customer',_("view all customer")),
('view_all_supplier',_("view all supplier")),
)
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)
org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True)
def __unicode__(self):
name = ''
if self.org:
name = self.org.name
elif self.partner:
name = self.partner.name
return u"%s %s %s" % (name,self.account,self.title)
class Meta:
verbose_name = _('bank account')
verbose_name_plural = _('bank account')
class Project(generic.BO):
"""
工程项目
"""
STATUS = get_value_list('S012')
TYPES = get_value_list('S013')
index_weight = 1
code = models.CharField(_("project code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True)
name = models.CharField(_("project 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)
partner = models.ForeignKey(Partner,blank=True,null=True,verbose_name=_("partner"),limit_choices_to={"partner_type":"C"})
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')
description = models.TextField(_("description"),blank=True,null=True)
budget = models.DecimalField(_("budget"),max_digits=10,decimal_places=2,blank=True,null=True)
income = models.DecimalField(_("income"),max_digits=10,decimal_places=2,blank=True,null=True)
expand = models.DecimalField(_("expand"),max_digits=10,decimal_places=2,blank=True,null=True)
blueprint = models.FileField(_("blueprint"),upload_to='project',blank=True,null=True)
offer = models.FileField(_("offer sheet"),upload_to='offer sheet',blank=True,null=True)
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)
class Meta:
verbose_name = _('project')
verbose_name_plural = _('project')
class Warehouse(models.Model):
"""
仓库
"""
index_weight = 6
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_40)
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)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('warehouse')
verbose_name_plural = _('warehouse')
class Measure(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)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('measure')
verbose_name_plural = _('measure')
class Trade(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"),null=True,blank=True)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('trade')
verbose_name_plural = _('trade')
ordering = ['code']
class Brand(models.Model):
"""
品牌
"""
index_weight = 101
trade = models.ForeignKey(Trade,verbose_name=_("trade"),null=True,blank=True)
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)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('brand')
verbose_name_plural = _('brand')
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)
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)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('category')
verbose_name_plural = _('category')
class TechnicalParameterName(models.Model):
"""
技术参数-名称,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数
"""
index_weight = 7
category = models.ForeignKey(Category,verbose_name=_("material category"))
name = models.CharField(_("name"),max_length=const.DB_CHAR_NAME_40)
status = models.BooleanField(_("in use"),default=True)
def __unicode__(self):
return '%s' % self.name
class Meta:
verbose_name = _('technical parameter')
verbose_name_plural = _('technical parameter')
class TechnicalParameterValue(models.Model):
"""
技术参数-值,将技术参数绑定于物料分类上,在此分类下的物料自动继承全部技术参数
"""
tech_name = models.ForeignKey(TechnicalParameterName,verbose_name=_("technical name"))
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)
def __unicode__(self):
return '%s' % self.value
class Meta:
verbose_name = _('technical value')
verbose_name_plural = _('technical value')
class Material(generic.BO):
"""
物料
"""
index_weight = 4
code = models.CharField(_("material code"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True)
barcode = models.CharField(_("bar code"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
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"))
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"))
measure = models.ManyToManyField(Measure,verbose_name=_("measure"))
params = models.ManyToManyField(TechnicalParameterValue,verbose_name=_("technical parameter"),through='MaterialParam')
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)
def __unicode__(self):
return "%s %s" % (self.code,self.name)
class Meta:
verbose_name = _('material')
verbose_name_plural = _('material')
ordering = ['tp','code']
class MaterialParam(models.Model):
"""
"""
material = models.ForeignKey(Material)
param_value = models.ForeignKey(TechnicalParameterValue)
param_name = models.ForeignKey(TechnicalParameterName,blank=Trade,null=True)
creation = models.DateField(auto_now_add=True)
def __unicode__(self):
return '%s' % self.param_value
class Meta:
verbose_name = _('material parameter')
verbose_name_plural = _('material parameter')
class ExtraParam(models.Model):
"""
"""
DATA_TYPE = (
('CHAR',_('CHAR')),
('NUM',_('NUMBER')),
('DATE',_('DATE')),
)
material = models.ForeignKey(Material,verbose_name=_("material"))
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)
def __unicode__(self):
return "%s" % self.name
class Meta:
verbose_name = _("extra param")
verbose_name_plural = _("extra params")
class ExpenseAccount(generic.BO):
"""
费用科目
"""
CATEGORY = (
('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,choices=CATEGORY,default='PU')
description = models.TextField(_("description"),blank=True,null=True)
parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True)
status = models.BooleanField(_("in use"),default=True)
org = models.ForeignKey(Organization,verbose_name=_("organization"),blank=True,null=True)
class Meta:
verbose_name = _('expenses account')
verbose_name_plural = _('expenses account')
ordering = ['category','code']
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)
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)
gender = models.CharField(_("gender"),max_length=const.DB_CHAR_CODE_2,choices=const.get_value_list('gender'),default='1')
idcard = models.CharField(_("id card"),max_length=const.DB_CHAR_NAME_20)
country = models.CharField(_("nationality"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,default='CN',choices=const.get_value_list('S022'))
hometown = models.CharField(_("hometown"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
address = models.CharField(_("home address"),max_length=const.DB_CHAR_NAME_120,blank=True,null=True)
banknum = models.CharField(_("bank account"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
bankname = models.CharField(_("bank name"),max_length=const.DB_CHAR_NAME_80,blank=True,null=True)
emergency = models.CharField(_("emergency contacts"),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
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'))
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)
startday = models.DateField(_("start date"),blank=True,null=True)
religion = models.CharField(_("religion"),max_length=const.DB_CHAR_CODE_2,default='00',choices=const.get_value_list('S020'),blank=True,null=True,)
marital = models.CharField(_("marital status"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S023'),default='10')
party = models.CharField(_("political party"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S026'),default='13')
nation = models.CharField(_("nation"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S021'),default='01')
ygxs = models.CharField(_("employ ygxs"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S019'),default='2')
status = models.CharField(_("employ status"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S016'),default='10')
category = models.CharField(_("employ category"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S018'),default='21')
literacy = models.CharField(_("literacy"),max_length=const.DB_CHAR_CODE_2,default='10',choices=const.get_value_list('S024'),blank=True,null=True)
major = models.CharField(_("major type"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S038'),default='99')
degree = models.CharField(_("major degree"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S037'),default='4')
spjob = models.CharField(_("special job"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S042'),default='00')
health = models.CharField(_("health"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S043'),default='1')
tag1 = models.CharField(_("tag1 fzjr"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S039'),default='99')
tag2 = models.CharField(_("tag2 dwld"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S040'),default='9')
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)
def age(self):
import datetime
if self.birthday:
cnt = datetime.date.today().year-self.birthday.year
return cnt
def work_age(self):
import datetime
if self.birthday and self.workday:
cnt = datetime.date.today().year-self.workday.year
return cnt
def __unicode__(self):
return u'%s %s'%(self.code,self.name)
age.short_description = u'年龄'
work_age.short_description = u'工龄'
class Meta:
verbose_name = _("employee")
verbose_name_plural = _("employee")
permissions = (
('view_all_employee',_("view all employee")),
)
class Family(generic.BO):
"""
家庭成员
"""
relation = models.CharField(_("family title"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S025'))
status = models.CharField(_("social status"),max_length=const.DB_CHAR_CODE_2,blank=True,null=True,choices=const.get_value_list('S029'),default='17')
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,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"))
class Meta:
verbose_name = _("family member")
verbose_name_plural = _("family member")
class Education(generic.BO):
"""
教育履历
"""
edu_type = models.CharField(_("edu type"),max_length=const.DB_CHAR_CODE_2,choices=const.get_value_list('S035'),default='1')
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"))
class Meta:
verbose_name = _("education experience")
verbose_name_plural = _("education experience")
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"))
class Meta:
verbose_name = _("work experience")
verbose_name_plural = _("work experience")
class DataImport(generic.BO):
"""
Data import
"""
actions = {}
STATUS = (
('0',_('NEW')),
('1',_('EXECUTED')),
)
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']})
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)
status = models.CharField(_('status'),max_length=const.DB_CHAR_CODE_2,default='0',choices=STATUS)
def action_import(self,request):
from django.db import transaction
if self.attach:
if self.handler:
klass = ExcelManager().handlers.get(self.handler)
with transaction.atomic():
klass.handle(self,self.attach)
self.status = 1
self.save()
else:
import xlrd
import os
from mis import settings
path = os.path.join(settings.MEDIA_ROOT,self.attach.name)
workbook = xlrd.open_workbook(path)
sheet = workbook.sheet_by_index(0)
row_count = sheet.nrows
col_count = sheet.ncols
cols = []
with transaction.atomic():
for row_index in range(row_count):
line = sheet.row_values(row_index)
if row_index == 0:
cols = line
continue
elif row_index == 1:
continue
else:
klass = self.content_type.model_class()
values = line
params = {}
for name in cols:
index = cols.index(name)
v = values[index]
if type(v) == str:
v = force_text(v.decode('gbk'))
params[name]=v
# print 'name is %s value is %s'%(name,v)
try:
params.pop('')
except Exception,e:
pass
# print params
klass.objects.create(**params)
self.status = '1'
self.save()
class Meta:
verbose_name = _("data import")
verbose_name_plural = _("data import")
class Document(generic.BO):
"""
文档管理
"""
TP = (
('00',_('SYSTEM MANUAL')),
('10',_('BUSINESS DOC')),
)
STATUS = (
('0',_('draft')),
('1',_('published'))
)
index_weight = 8
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)
keywords = models.CharField(_('keywords'),max_length=const.DB_CHAR_NAME_120,blank=True,null=True)
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)
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)
attach = models.FileField(_('attach'),blank=True,null=True,upload_to='doc')
class Meta:
verbose_name = _("document")
verbose_name_plural = _("documents")
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+6
View File
@@ -0,0 +1,6 @@
from django.conf.urls import include, url,static
import basedata.views
urlpatterns = [
url(r"dataimport/(?P<object_id>\d+)/action", basedata.views.action_import),
]
+42
View File
@@ -0,0 +1,42 @@
# coding=utf-8
from django.contrib.admin import site
from django.http.response import HttpResponseRedirect
from django.utils.encoding import force_text
from django.template.response import TemplateResponse
from django.contrib import messages
from basedata.models import DataImport
from django.utils.translation import ugettext_lazy as _
def action_import(request,object_id):
"""
数据导入操作
:param request:
:param object_id:
:return:
"""
title = _("Are you sure?")
obj = DataImport.objects.get(id=int(object_id))
opts = obj._meta
objects_name = force_text(opts.verbose_name)
if request.POST.get("post"):
obj.action_import(request)
try:
messages.success(request,_('data import successfully'))
except Exception,e:
messages.error(request,e)
return HttpResponseRedirect("/admin/basedata/dataimport/%s"%(object_id))
context = dict(
site.each_context(request),
title=title,
opts=opts,
objects_name=objects_name,
object=obj,
)
request.current_app = site.name
return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)