def get(self): if 'clear' in self.request.arguments(): Status(self.is_test()).clear() self.redirect(self.request.path) else: self.show('admin_main.html', { 'stts':Status(self.is_test()).get_list(), 'text':Params().get('view'), })
def post(self): stts = {} if 'clear' in self.request.arguments(): Status(self.is_test()).clear() else: for name in self.request.arguments(): stts[name] = self.request.get(name, default_value='') stts['last_mod'] = tz.nowjststr() Status(self.is_test()).merge(stts) self.redirect(self.request.url)
def get(self): filename = self.request.path.replace('/download/', '') task = filename[0:2] cat = filename[3:4] ts = "%(y)s-%(m)s-%(d)s" % { 'y':filename[5:9], 'm':filename[9:11], 'd':filename[11:13], } stts = Status() if stts.get("ts_ar_%(cat)s" % {'cat':cat})[0:10] != ts: self.error(404) return key = stts.get("key_%(task)s_%(cat)s" % {'cat':cat, 'task':task}) blob_info = blobstore.BlobInfo(blobstore.BlobKey(key)) zr = blob_info.open() self.response.headers['Content-Type'] = 'application/zip' self.response.out.write(zr.read()) zr.close()
def __init__(self, task, cat): self.__tsk = task self.__cat = cat self.__stt = Status()
class Task(): """タスク""" __tsk = None __cat = None __stt = None def __init__(self, task, cat): self.__tsk = task self.__cat = cat self.__stt = Status() def get_task(self): """タスク名を取得する。""" return self.__tsk def get_cat(self): """分類(住所/事業所)を取得する。""" return self.__cat def get_prev(self): """データのインプットになるタスク名を取得する。""" return Params().get('task_prv', self.__tsk) def __get_key(self, name): """ステータスのキーを取得する。""" return '%(nam)s_%(tsk)s_%(cat)s' % { 'nam': name, 'tsk': self.__tsk, 'cat': self.__cat, } def __get_key_prev(self, name): """インプットデータのステータスのキーを取得する。""" return '%(nam)s_%(prv)s_%(cat)s' % { 'nam': name, 'prv': self.get_prev(), 'cat': self.__cat, } def get_ts(self): """日本郵便配布データのタイムスタンプを取得する。""" return self.__stt.get('ts_ar_%(cat)s' % {'cat': self.__cat}) def get_ts_short(self): """日本郵便配布データのタイムスタンプを短い書式で取得する。""" return self.get_ts().replace('-', '').replace(':', '').replace(' ', '')[0:8] def get_stt(self, name): """ステータスを取得する。""" return self.__stt.get(self.__get_key(name)) def get_stt_prev(self, name): """インプットデータのステータスを取得する。""" return self.__stt.get(self.__get_key_prev(name)) def set_stt(self, stt): """ステータスを設定する。""" dic = {} for key in stt.keys(): dic[self.__get_key(key)] = stt[key] self.__stt.merge(dic) def kick(self): """処理を実行する。""" return self.convert() def convert(self): """データ変換処理を実行する。""" stts = {} key = self.get_stt_prev('key') blob_info = blobstore.BlobInfo(blobstore.BlobKey(key)) zr = blob_info.open() zi = zipfile.ZipFile(zr, 'r') if len(zi.infolist()) < 1: zi.close() zr.close() return None zw = StringIO.StringIO() zo = zipfile.ZipFile(zw, 'w', zipfile.ZIP_DEFLATED) self.proc_all(zi, zo, stts) zo.close() zi.close() zr.close() con = zw.getvalue() stts['csz'] = len(con) sha1 = hashlib.sha1() sha1.update(con) stts['dig'] = sha1.hexdigest() stts['key'] = save_blob( con, '%(tsk)s_%(cat)s-%(ts)s.zip' % { 'cat': self.get_cat(), 'tsk': self.get_task(), 'ts': self.get_ts_short(), }) self.set_stt(stts) return 'ok' # can be overidden def proc_all(self, zi, zo, stts): """全てのインプットを処理する。""" dsz = 0 cnt = 0 for zip_info in zi.infolist(): for data in self.proc(zi, zip_info): zo.writestr(data[0], data[1], zipfile.ZIP_DEFLATED) dsz += len(data[1]) cnt += 1 stts['dsz'] = dsz stts['cnt'] = cnt # to be overidden def proc(self, zi, zip_info): """1個のインプットを処理する。""" pass
class Task(): """タスク""" __tsk = None __cat = None __stt = None def __init__(self, task, cat): self.__tsk = task self.__cat = cat self.__stt = Status() def get_task(self): """タスク名を取得する。""" return self.__tsk def get_cat(self): """分類(住所/事業所)を取得する。""" return self.__cat def get_prev(self): """データのインプットになるタスク名を取得する。""" return Params().get('task_prv', self.__tsk) def __get_key(self, name): """ステータスのキーを取得する。""" return '%(nam)s_%(tsk)s_%(cat)s' % { 'nam':name, 'tsk':self.__tsk, 'cat':self.__cat, } def __get_key_prev(self, name): """インプットデータのステータスのキーを取得する。""" return '%(nam)s_%(prv)s_%(cat)s' % { 'nam':name, 'prv':self.get_prev(), 'cat':self.__cat, } def get_ts(self): """日本郵便配布データのタイムスタンプを取得する。""" return self.__stt.get('ts_ar_%(cat)s' % {'cat':self.__cat}) def get_ts_short(self): """日本郵便配布データのタイムスタンプを短い書式で取得する。""" return self.get_ts().replace('-', '').replace(':', '').replace(' ', '')[0:8] def get_stt(self, name): """ステータスを取得する。""" return self.__stt.get(self.__get_key(name)) def get_stt_prev(self, name): """インプットデータのステータスを取得する。""" return self.__stt.get(self.__get_key_prev(name)) def set_stt(self, stt): """ステータスを設定する。""" dic = {} for key in stt.keys(): dic[self.__get_key(key)] = stt[key] self.__stt.merge(dic) def kick(self): """処理を実行する。""" return self.convert() def convert(self): """データ変換処理を実行する。""" stts = {} key = self.get_stt_prev('key') blob_info = blobstore.BlobInfo(blobstore.BlobKey(key)) zr = blob_info.open() zi = zipfile.ZipFile(zr, 'r') if len(zi.infolist()) < 1: zi.close() zr.close() return None zw = StringIO.StringIO() zo = zipfile.ZipFile(zw, 'w', zipfile.ZIP_DEFLATED) self.proc_all(zi, zo, stts) zo.close() zi.close() zr.close() con = zw.getvalue() stts['csz'] = len(con) sha1 = hashlib.sha1() sha1.update(con) stts['dig'] = sha1.hexdigest() stts['key'] = save_blob(con, '%(tsk)s_%(cat)s-%(ts)s.zip' % { 'cat':self.get_cat(), 'tsk':self.get_task(), 'ts':self.get_ts_short(), }) self.set_stt(stts) return 'ok' # can be overidden def proc_all(self, zi, zo, stts): """全てのインプットを処理する。""" dsz = 0 cnt = 0 for zip_info in zi.infolist(): for data in self.proc(zi, zip_info): zo.writestr(data[0], data[1], zipfile.ZIP_DEFLATED) dsz += len(data[1]) cnt += 1 stts['dsz'] = dsz stts['cnt'] = cnt # to be overidden def proc(self, zi, zip_info): """1個のインプットを処理する。""" pass