313 lines
12 KiB
Python
313 lines
12 KiB
Python
# coding=utf-8
|
|
__author__ = 'zhugl'
|
|
# created at 15-4-21
|
|
import datetime
|
|
import xlwt
|
|
import re
|
|
from django.db import models
|
|
from django.db import connection,transaction
|
|
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.contrib.contenttypes.models import ContentType
|
|
from django.utils.text import force_text
|
|
from django.utils.encoding import smart_str
|
|
from django.utils.http import urlquote
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from common import const
|
|
from midware import cuser
|
|
|
|
|
|
def update(sql, params=None):
|
|
"""
|
|
:param sql:
|
|
:param params:
|
|
:return:
|
|
"""
|
|
cursor = connection.cursor()
|
|
with transaction.atomic():
|
|
try:
|
|
if params:
|
|
cursor.execute(sql,params)
|
|
else:
|
|
cursor.execute(sql)
|
|
except Exception,e:
|
|
print e
|
|
|
|
def get_app_model_info_from_request(request):
|
|
"""
|
|
|
|
"""
|
|
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)
|
|
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}
|
|
return None
|
|
|
|
|
|
class MineBOManager(models.Manager):
|
|
"""
|
|
get the objects created by current login user
|
|
"""
|
|
def get_query_set(self):
|
|
return super(MineBOManager,self).get_query_set().filter(creator=cuser.getuser())
|
|
|
|
|
|
class BOManager(models.Manager):
|
|
"""
|
|
"""
|
|
def get_query_set(self):
|
|
return super(BOManager,self).get_query_set()
|
|
|
|
|
|
class BO(models.Model):
|
|
"""
|
|
All business object derive from this class
|
|
"""
|
|
begin = models.DateField(_('begin date'),blank=True,null=True)
|
|
end = models.DateField(_('end date'),blank=True,null=True)
|
|
creator = models.CharField(_("creator"),blank=True,null=True,max_length=const.DB_CHAR_NAME_20)
|
|
modifier = models.CharField(_("modifier"),blank=True,null=True,max_length=const.DB_CHAR_NAME_20)
|
|
creation = models.DateTimeField(_('creation'),auto_now_add=True,blank=True,null=True)
|
|
modification = models.DateTimeField(_('modification'),auto_now=True,blank=True,null=True)
|
|
# mine = MineBOManager()
|
|
objects = models.Manager()
|
|
|
|
def __unicode__(self):
|
|
display = getattr(self,'name',None) or getattr(self,'title',None) or getattr(self,'description',None)
|
|
if not display:
|
|
display = ' '
|
|
return u'%s' % display
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
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']
|
|
list_per_page = 18
|
|
actions = ['export_selected_data']
|
|
|
|
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
|
|
"""
|
|
|
|
:param request:
|
|
:param object_id:
|
|
:param form_url:
|
|
:param extra_context:
|
|
:return:
|
|
"""
|
|
app_info = get_app_model_info_from_request(request)
|
|
workflow_modal = None
|
|
workflow_instance = None
|
|
has_workflow_modal = False
|
|
has_workflow_instance = False
|
|
show_workflow_line = False
|
|
show_submit_button = False
|
|
can_restart = False
|
|
can_edit = False
|
|
# print app_info
|
|
if app_info:
|
|
try:
|
|
modal = ContentType.objects.get(app_label='workflow',model='modal')
|
|
workflow_modal = modal.get_object_for_this_type(app_name=app_info['app'],model_name=app_info['model'])
|
|
has_workflow_modal = True
|
|
# print workflow_modal.code
|
|
instance = ContentType.objects.get(app_label='workflow',model='instance')
|
|
workflow_instance = instance.get_object_for_this_type(modal=workflow_modal,object_id=app_info['id'])
|
|
has_workflow_instance = True
|
|
todo = ContentType.objects.get(app_label='workflow',model='todolist')
|
|
todo_list = todo.model_class().objects.filter(inst=workflow_instance,status=0,user=request.user)
|
|
x = todo_list.all()
|
|
|
|
if x and len(x)>0:
|
|
can_edit = x[0].node.can_edit
|
|
if todo_list.count() > 0:
|
|
# print 'we fount it'
|
|
unread = todo_list.filter(is_read=0)
|
|
show_workflow_line = True
|
|
if unread.count() > 0:
|
|
unread.update(is_read=1,read_time=datetime.datetime.now())
|
|
if workflow_instance.status == 3 and request.user == workflow_instance.starter:
|
|
can_restart = True
|
|
show_workflow_line = True
|
|
|
|
except Exception,e:
|
|
print Exception,e
|
|
|
|
if workflow_modal and not workflow_instance:
|
|
show_submit_button = True
|
|
extra_context = extra_context or {}
|
|
ctx = dict(
|
|
has_workflow_instance = has_workflow_instance,
|
|
has_workflow_modal = has_workflow_modal,
|
|
workflow_modal = workflow_modal,
|
|
workflow_instance = workflow_instance,
|
|
show_workflow_line = show_workflow_line,
|
|
can_restart = can_restart,
|
|
can_edit = can_edit,
|
|
show_submit_button = show_submit_button,
|
|
)
|
|
if len(self.extra_buttons) > 0:
|
|
buttons = dict(
|
|
extra_buttons = self.extra_buttons
|
|
)
|
|
ctx.update(buttons)
|
|
extra_context.update(ctx)
|
|
# print extra_context
|
|
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:
|
|
:param extra_context:
|
|
:return:
|
|
"""
|
|
app_info = get_app_model_info_from_request(request)
|
|
# print app_info
|
|
if app_info:
|
|
try:
|
|
modal = ContentType.objects.get(app_label='workflow',model='modal')
|
|
workflow_modal = modal.get_object_for_this_type(app_name=app_info['app'],model_name=app_info['model'])
|
|
has_workflow_modal = True
|
|
instance = ContentType.objects.get(app_label='workflow',model='instance')
|
|
workflow_instance = instance.get_object_for_this_type(modal=workflow_modal,object_id=app_info['id'])
|
|
has_workflow_instance = True
|
|
history = ContentType.objects.get(app_label='workflow',model='history')
|
|
history_list = history.model_class().objects.filter(inst=workflow_instance)
|
|
has_history = True
|
|
todo = ContentType.objects.get(app_label='workflow',model='todolist')
|
|
todo_list = todo.model_class().objects.filter(inst=workflow_instance,status=0).exclude(node=None)
|
|
|
|
extra_context = extra_context or {}
|
|
ctx = dict(
|
|
has_workflow_instance = has_workflow_instance,
|
|
has_workflow_modal = has_workflow_modal,
|
|
workflow_modal = workflow_modal,
|
|
workflow_instance = workflow_instance,
|
|
history_list = history_list,
|
|
has_history = has_history,
|
|
todo_list = todo_list,
|
|
)
|
|
# print history_list
|
|
extra_context.update(ctx)
|
|
except Exception,e:
|
|
print Exception,e
|
|
pass
|
|
return super(BOAdmin,self).history_view(request,object_id,extra_context)
|
|
|
|
def get_changeform_initial_data(self, request):
|
|
import datetime
|
|
return {'begin':datetime.date.today,'end':datetime.date(9999,12,31)}
|
|
|
|
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))
|
|
try:
|
|
setattr(obj,'user',request.user)
|
|
except Exception,e:
|
|
pass
|
|
|
|
super(BOAdmin,self).save_model(request,obj,form,change)
|
|
# print '=========it is here========='
|
|
try:
|
|
code = getattr(obj,'code')
|
|
# print code
|
|
if code is None or len(code) == 0:
|
|
fmt = '%s%0'+str(self.CODE_NUMBER_WIDTH)+'d'
|
|
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
|
|
|
|
# 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')
|
|
file_name = force_text(ops.verbose_name+dd)
|
|
sheet = workbook.add_sheet(force_text(ops.verbose_name))
|
|
obj_fields = getattr(self,'export_fields',None) or self.list_display or self.fields
|
|
|
|
head_col_index = 0
|
|
for field in obj_fields:
|
|
col_name = field
|
|
try:
|
|
f = ops.get_field(field)
|
|
col_name = f.verbose_name
|
|
except Exception,e:
|
|
f = getattr(self.model,field)
|
|
if hasattr(f,'short_description'):
|
|
col_name = f.short_description
|
|
sheet.write(0,head_col_index,force_text(col_name))
|
|
head_col_index+=1
|
|
row_index = 1
|
|
for obj in queryset:
|
|
col_index = 0
|
|
for field in obj_fields:
|
|
f = field
|
|
try:
|
|
f = ops.get_field(field)
|
|
except Exception,e:
|
|
pass
|
|
v = getattr(obj,field,'')
|
|
if hasattr(v,'__call__') or callable(v):
|
|
v = v()
|
|
elif type(f) == fields.DateField:
|
|
v = v.strftime('%Y-%m-%d')
|
|
elif type(f) == fields.DateTimeField:
|
|
v = v.strftime('%Y-%m-%d %H:%M')
|
|
elif type(f) == fields.CharField and f.choices:
|
|
fc = 'get_'+field+'_display'
|
|
v = getattr(obj,fc)()
|
|
elif type(f) == related.ForeignKey:
|
|
v = str(v)
|
|
sheet.write(row_index,col_index,v)
|
|
col_index += 1
|
|
row_index += 1
|
|
response = HttpResponse(content_type='application/vnd.ms-excel')
|
|
agent = request.META.get('HTTP_USER_AGENT')
|
|
nn = smart_str(file_name)
|
|
if agent and re.search('MSIE',agent):
|
|
nn = urlquote(file_name)
|
|
response['Content-Disposition'] = 'attachment; filename=%s.xls'%nn
|
|
workbook.save(response)
|
|
return response
|
|
#self.message_user(request,'SUCCESS')
|
|
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',)
|