import time from calendar import monthrange from netforce.model import Model, fields class Period(Model): _name="clinic.period" _string="Period" def _get_last_period(self,ids,context={}): res={} for obj in self.browse(ids): last_id=None for line in obj.lines: if line.state=='close': last_id=line.id res[obj.id]=last_id return res _fields={ "name": fields.Char("Name",required=True,search=True), 'date_start': fields.Date("From",required=True), 'date_stop': fields.Date("To",required=True), 'nmonth': fields.Integer("Count",required=True), 'lines': fields.One2Many("clinic.period.line","period_id", "Lines"), 'last_period_id': fields.Many2One("clinic.period.line","Last Period",function="_get_last_period"), } def _get_start(self,context={}): year=time.strftime("%Y") return '%s-01-01'%year def _get_stop(self,context={}): year=time.strftime("%Y") return '%s-01-30'%year _defaults={ 'name': lambda *a: time.strftime("%Y"), 'date_start': _get_start, 'date_stop': _get_stop, 'nmonth': 12, } def close_period(self,ids,context={}): obj=self.browse(ids)[0] for line in obj.lines: line.write({ 'state': 'close', }) def gen_period(self,ids,context={}): obj=self.browse(ids)[0] for line in obj.lines: line.delete() year,month,day=[int(x) for x in obj.date_start.split("-")] tyear,tmonth,tday=[int(x) for x in obj.date_stop.split("-")] lines=[] def _zfill(n): return str(n).zfill(2) for m in range(1,obj.nmonth): if tmonth >12: tmonth=1 tyear+=1 weekday, ttotal_day=monthrange(int(tyear), int(tmonth)) weekday, total_day=monthrange(int(year), int(month)) if day > total_day: day=total_day if tday > ttotal_day: tday=ttotal_day lines.append(('create',{ 'date_start': '%s-%s-%s'%(year,_zfill(month),_zfill(day)), 'date_stop': '%s-%s-%s'%(tyear,_zfill(tmonth),_zfill(tday)), })) if month==tmonth: tmonth+=1 month=tmonth year=tyear tmonth+=1 obj.write({ 'lines': lines, }) return { 'next': { 'name': 'clinic_period', 'mode': 'form', 'active_id': obj.id, }, 'flash': 'Generate successfully', } Period.register()