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
+1
View File
@@ -0,0 +1 @@
default_app_config = "selfhelp.apps.MyAppConfig"
+219
View File
@@ -0,0 +1,219 @@
# coding=utf-8
# coding = utf-8
import datetime
from django.contrib import admin
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.db.models.aggregates import Sum
from django.utils.translation import ugettext_lazy as _
from common import generic
from common import const
from basedata.models import Material,ExtraParam,Employee,Position
from selfhelp.models import WorkOrder,WOExtraValue,WOItem,Reimbursement,ReimbursementItem,Loan,Enroll,Feedback,Activity
class ParamValueInline(admin.TabularInline):
model = WOExtraValue
fields = ('param_name','param_value')
readonly_fields = ['param_name']
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == 'param_name':
app_info = generic.get_app_model_info_from_request(request)
instance = app_info['obj']
if instance:
kwargs['queryset'] = ExtraParam.objects.filter(material=instance.service)
return super(ParamValueInline,self).formfield_for_foreignkey(db_field,request,**kwargs)
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 1
class ItemInline(admin.TabularInline):
model = WOItem
raw_id_fields = ['material']
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 1
class WorkOrderAdmin(generic.BOAdmin):
"""
"""
CODE_PREFIX = 'WO'
CODE_NUMBER_WIDTH = 5
list_display = ['code','begin','title','classification','business_domain','status']
list_display_links = ['code','title']
exclude = ['creator','modifier','creation','modification']
search_fields = ['code','title']
list_filter = ['classification','service','status']
fields = (
('begin','end',),
('code','refer',),('classification','business_domain',),
('service','project',),
('title','status',),('description',),('attach',),('detail',)
)
readonly_fields = ['status']
raw_id_fields = ['service','project','refer']
inlines = [ItemInline,ParamValueInline]
date_hierarchy = 'begin'
def save_model(self, request, obj, form, change):
if obj.user is None:
obj.user = request.user
super(WorkOrderAdmin,self).save_model(request,obj,form,change)
def get_changeform_initial_data(self, request):
import datetime
td = datetime.date.today()
end = td + datetime.timedelta(30)
return {'begin':datetime.date.today, 'end':end}
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == 'refer':
app_info = generic.get_app_model_info_from_request(request)
if app_info and app_info['obj']:
kwargs['queryset'] = WorkOrder.objects.exclude(id=app_info['id'])
return super(WorkOrderAdmin,self).formfield_for_foreignkey(db_field,request,**kwargs)
class LoanAdmin(generic.BOAdmin):
CODE_PREFIX = 'JK'
CODE_NUMBER_WIDTH = 5
list_display = ['code','title','project','loan_amount','applier','status']
list_display_links = ['code','title']
readonly_fields = ['status','logout_time','logout_amount']
raw_id_fields = ['project','user']
fields = (
('code',),('title','loan_amount',),('description',),('project'),('user','status'),('logout_time','logout_amount',),
)
extra_buttons = [{'href':'pay','title':_('pay')}]
search_fields = ['code','title','user__username']
date_hierarchy = 'begin'
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
if object_id:
try:
obj = Loan.objects.get(id=object_id)
if obj and obj.status == 'P':
extra_context = extra_context or {}
extra_context.update(dict(readonly=True))
except Exception,e:
pass
return super(LoanAdmin,self).changeform_view(request,object_id,form_url,extra_context)
def save_model(self, request, obj, form, change):
if obj and obj.user is None:
obj.user = request.user
super(LoanAdmin,self).save_model(request,obj,form,change)
class ReimbursementItemInline(admin.TabularInline):
model = ReimbursementItem
raw_id_fields = ['expense_account']
def get_extra(self, request, obj=None, **kwargs):
if obj:
return 0
else:
return 1
class ReimbursementAdmin(generic.BOAdmin):
CODE_PREFIX = 'BX'
CODE_NUMBER_WIDTH = 5
list_display = ['code','title','project','amount','applier','status']
list_display_links = ['code','title']
inlines = [ReimbursementItemInline]
raw_id_fields = ['project','wo','user','org']
readonly_fields = ['loan_amount','pay_time','status','amount']
fieldsets = [
(None,{'fields':[('code','user'),('title','amount','status',),('description',),('project','wo',)]}),
(_('fico'),{'fields':[('org',),('loan',),('logout_amount','pay_amount',)],'classes': ['collapse']})
]
extra_buttons = [{'href':'pay','title':_('pay')}]
search_fields = ['code','title','project__code','project__name','user__username']
date_hierarchy = 'begin'
def get_changeform_initial_data(self, request):
apps = generic.get_app_model_info_from_request(request)
obj = getattr(apps,'obj',None)
current = request.user
if obj:
current = obj.user
sm = Loan.objects.filter(user=current).aggregate(Sum('loan_amount')).get('loan_amount__sum') or 0.00
return {'loan_amount':sm}
def save_model(self, request, obj, form, change):
if obj and obj.user is None:
obj.user = request.user
super(ReimbursementAdmin,self).save_model(request,obj,form,change)
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == 'loan':
apps = generic.get_app_model_info_from_request(request)
current = request.user
if apps:
obj = apps.get('obj')
current = obj.user
if obj.status == 'P':
kwargs['queryset']=Loan.objects.filter(id=obj.loan.id)
else:
kwargs['queryset']=Loan.objects.filter(user=current,is_clear=0)
else:
kwargs['queryset']=Loan.objects.filter(user=current,is_clear=0)
return super(ReimbursementAdmin,self).formfield_for_foreignkey(db_field,request,**kwargs)
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
if object_id:
try:
obj = Reimbursement.objects.get(id=object_id)
if obj and obj.status == 'P':
extra_context = extra_context or {}
extra_context.update(dict(readonly=True))
except Exception,e:
pass
return super(ReimbursementAdmin,self).changeform_view(request,object_id,form_url,extra_context)
class EnrollInline(admin.TabularInline):
model = Enroll
class FeedbackInline(admin.TabularInline):
model = Feedback
class ActivityAdmin(generic.BOAdmin):
CODE_PREFIX = 'AC'
CODE_NUMBER_WIDTH = 5
list_display = ['code','begin_time','end_time','title','classification','room']
list_display_links = ['code','title']
raw_id_fields = ['room','parent']
fieldsets = [
(None,{'fields':[('begin_time','end_time',),('title','classification',),('description',),
('host','speaker',),('room','location',),('attach',)]}),
(_('other info'),{'fields':[('mail_list',),('parent',),('mail_notice','short_message_notice','weixin_notice',)],'classes': ['collapse']})
]
def get_changeform_initial_data(self, request):
now = datetime.datetime.now()
begin = now + datetime.timedelta(hours=12)
end = begin + datetime.timedelta(hours=6)
return {'begin_time':begin,'end_time':end}
admin.site.register(WorkOrder,WorkOrderAdmin)
admin.site.register(Loan,LoanAdmin)
admin.site.register(Reimbursement,ReimbursementAdmin)
admin.site.register(Activity,ActivityAdmin)
+11
View File
@@ -0,0 +1,11 @@
# created at 15-5-23
# coding=utf-8
__author__ = 'zhugl'
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _
class MyAppConfig(AppConfig):
name = 'selfhelp'
verbose_name = _("self help")
+330
View File
@@ -0,0 +1,330 @@
# coding=utf-8
import datetime
import os
import xlrd
import decimal
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.translation import ugettext_lazy as _
from common import generic
from common import const
from mis import settings
from basedata.models import Material,ExtraParam,Project,ExpenseAccount,Measure
from organ.models import OrgUnit
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)
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)
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)
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')
def __unicode__(self):
return u"%s-%s" % (self.code,self.title)
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
super(WorkOrder,self).save(force_insert,force_update,using,update_fields)
if self.service:
material = self.service
if self.woextravalue_set.count() < 1 and material.extraparam_set and material.extraparam_set.count() > 0:
for param in material.extraparam_set.all():
extra_param = WOExtraValue.objects.create(workorder=self,param_name=param)
self.woextravalue_set.add(extra_param)
item_count = WOItem.objects.filter(workorder=self).count()
if self.detail and item_count == 0:
path = os.path.join(settings.MEDIA_ROOT,self.detail.name)
workbook = xlrd.open_workbook(path)
sheet = workbook.sheet_by_index(0)
row_count = sheet.nrows
with transaction.atomic():
for row_index in range(row_count):
row = sheet.row_values(row_index)
if row_index == 0:
doc_type = row[1]
if doc_type.startswith('0'):
break
else:
continue
elif row_index < 3:
continue
material = None
measure = None
try:
measure = Measure.objects.get(code=row[4])
except Exception,e:
measure = Measure.objects.create(code=row[4],name=force_text(row[5]))
try:
material = Material.objects.get(code=row[0])
except Exception,e:
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])
class Meta:
verbose_name = _("workorder apply")
verbose_name_plural = _("workorder apply")
class Media:
js = ('js/workorder.js',)
class WOExtraValue(models.Model):
"""
"""
workorder = models.ForeignKey(WorkOrder,verbose_name=_("workorder"))
param_name = models.ForeignKey(ExtraParam,verbose_name=_("extra param"))
param_value = models.CharField(_("param value"),blank=True,null=True,max_length=const.DB_CHAR_NAME_40)
class Meta:
verbose_name = _("extra value")
verbose_name_plural = _("extra values")
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"})
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)
price = models.DecimalField(_("price"),max_digits=10,decimal_places=4,blank=True,null=True)
class Meta:
verbose_name = _("workorder item")
verbose_name_plural = _("workorder items")
class Loan(generic.BO):
"""
"""
LOAD_STATUS = (
('N',_("NEW")),
('I',_("IN PROGRESS")),
('A',_("APPROVED")),
('P',_("PAYED"))
)
index_weight = 3
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)
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)
logout_amount = models.DecimalField(_("logout amount"),max_digits=10,decimal_places=2,blank=True,null=True)
pay_user = models.CharField(_('pay user'),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
pay_time = models.DateTimeField(_('pay time'),blank=True,null=True)
is_clear = models.BooleanField(_('is clear'),default=False)
def __unicode__(self):
import decimal
left = self.loan_amount
left -= self.logout_amount or decimal.Decimal(0.00)
name = '%s%s'%(self.user.last_name,self.user.first_name)
return '%s %s %s J:%.2f Y:%.2f' % (self.code,name,self.title,self.loan_amount,left)
def applier(self):
return u'%s%s'%(self.user.last_name,self.user.first_name)
applier.short_description = _('applier')
def action_pay(self,request):
self.pay_time = datetime.datetime.now()
self.pay_user = request.user.username
self.status = 'P'
self.save()
class Meta:
verbose_name = _("loan")
verbose_name_plural = _("loans")
permissions = (
('financial_pay',_("financial pay")),
)
class Reimbursement(generic.BO):
"""
"""
REIM_STATUS = (
('N',_("NEW")),
('I',_("IN PROGRESS")),
('A',_("APPROVED")),
('P',_("PAYED"))
)
index_weight = 2
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)
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_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)
pay_time = models.DateTimeField(_("pay time"),blank=True,null=True)
pay_user = models.CharField(_('pay user'),max_length=const.DB_CHAR_NAME_40,blank=True,null=True)
def applier(self):
return u'%s%s'%(self.user.last_name,self.user.first_name)
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
import decimal
if self.loan:
left = self.loan.loan_amount
left -= self.loan.logout_amount or decimal.Decimal(0.00)
if self.logout_amount is None or self.logout_amount == '':
if self.amount < left:
self.logout_amount = self.amount
else:
self.logout_amount = left
self.pay_amount = self.amount
if self.logout_amount:
self.pay_amount -= self.logout_amount
super(Reimbursement,self).save(force_insert,force_update,using,update_fields)
def action_pay(self,request):
if self.loan:
if self.logout_amount is None or self.logout_amount == '':
self.logout_amount = self.amount
if self.logout_amount < 0:
raise Exception(u'核销金额小于0')
if self.loan.logout_amount is None:
self.loan.logout_amount = self.logout_amount
else:
self.loan.logout_amount += self.logout_amount
if self.loan.loan_amount == self.loan.logout_amount:
self.loan.is_clear=True
self.loan.logout_time = datetime.datetime.now()
self.loan.save()
if self.amount > self.logout_amount:
self.pay_amount = self.amount - self.logout_amount
self.pay_time = datetime.datetime.now()
self.pay_user = request.user.username
self.status = 'P'
self.save()
applier.short_description = _('applier')
class Meta:
verbose_name = _("reimbursement")
verbose_name_plural = _("reimbursements")
permissions = (
('financial_pay',_("financial pay")),
)
class ReimbursementItem(models.Model):
"""
"""
import datetime
reimbursement = models.ForeignKey(Reimbursement,verbose_name=_("reimbursement"))
expense_account = models.ForeignKey(ExpenseAccount,verbose_name=_("expenses account"))
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)
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
super(ReimbursementItem,self).save(force_insert,force_update,using,update_fields)
sql = 'UPDATE selfhelp_reimbursement SET amount = (SELECT SUM(amount) FROM selfhelp_reimbursementitem WHERE reimbursement_id = %s) WHERE id = %s'
params = [self.reimbursement.id,self.reimbursement.id]
generic.update(sql,params)
class Meta:
verbose_name = _("fee item")
verbose_name_plural = _("fee items")
class Activity(generic.BO):
"""
"""
CLASSIFICATION = (
('T',_("Train")),
('M',_("Meeting")),
('G',_("Community")),
)
index_index_weight = 4
begin_time = models.DateTimeField(_('begin time'))
end_time = models.DateTimeField(_('end time'))
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)
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})
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)
mail_notice = models.BooleanField(_("mail notice"),default=1)
short_message_notice = models.BooleanField(_("short message notice"),default=1)
weixin_notice = models.BooleanField(_("weixin notice"),default=1)
status = models.BooleanField(_("published"),default=0)
publish_time = models.DateTimeField(_("publish time"),blank=True,null=True)
attach = models.FileField(_("attach"),blank=True,null=True,upload_to='activity')
class Meta:
verbose_name = _("activity")
verbose_name_plural = _("activities")
class Feedback(models.Model):
"""
"""
RANK = (
('A','A'),
('B','B'),
('C','C'),
('D','D'),
)
activity = models.ForeignKey(Activity)
user = models.ForeignKey(User)
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)
class Enroll(models.Model):
"""
"""
activity = models.ForeignKey(Activity)
user = models.ForeignKey(User)
enroll_time = models.DateTimeField(_("enroll time"),auto_now_add=True)
+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 selfhelp.views
urlpatterns = [
url(r"(?P<model>\w+)/(?P<object_id>\d+)/pay", selfhelp.views.pay_action),
]
+46
View File
@@ -0,0 +1,46 @@
# coding=utf-8
from django.contrib.admin import site
from django.contrib.contenttypes.models import ContentType
from django.db import connection
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 django.utils.translation import ugettext_lazy as _
from django.contrib.contenttypes.models import ContentType
def pay_action(request,model,object_id):
title = _("Are you sure?")
ct = ContentType.objects.get(app_label='selfhelp',model=model)
obj = ct.get_object_for_this_type(id=int(object_id))
opts = obj._meta
objects_name = force_text(opts.verbose_name)
if model == 'reimbursement':
loan = obj.loan
amount = obj.logout_amount
if loan and (amount is None or amount< 0):
messages.error(request,u'您选择了借款单据,但是未正确填写核销金额,请在\'财务信息\'栏目中更正')
return HttpResponseRedirect("/admin/selfhelp/%s/%s"%(model,object_id))
if request.POST.get("post"):
try:
obj.action_pay(request)
messages.success(request,_('action successfully'))
except Exception,e:
messages.error(request,e)
return HttpResponseRedirect("/admin/selfhelp/%s/%s"%(model,object_id))
context = dict(
site.each_context(request),
title=title,
opts=opts,
objects_name=objects_name,
object=obj,
action_name=_('pay')
)
request.current_app = site.name
return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)