def process_task(row): from uliweb import settings Task = functions.get_model('async_tasks') now = date.now() #check started status if row.status == STARTED: #check timeout if row.started_time + datetime.timedelta(milliseconds=row.timeout) > now: return else: #检查任务是否还在执行 keys_queue = settings.get_var('ASYNC_TASKS/tasks_keys_queue') redis = functions.get_redis() if redis.sismember(keys_queue, row.task_id): return row.startup_time = now handler = row.get_handler(log=log) #check depend task depend_task = row.check_depend_tasks(log) if depend_task: #依赖任务或父任务为取消时,当前任务取消 if depend_task.status == CANCEL or depend_task.current_status == CANCEL: msg = "Depend task {} has been cancelled.".format(depend_task.task_id) row.cancel(msg, log=log) log.debug("Current task {} cancelled because depend task {} status is CANCEL".format( row.task_id, depend_task.task_id )) #如果依赖任务失败,当前任务也置为失败 elif depend_task.status == FAILED: msg = "Current task {} FAILED because depend task {} status is FAILED".format( row.task_id, depend_task.task_id ) handler.save(status=FAILED, finished_time=date.now(), message=msg) log.info(msg) return if row.retry_times >= row.max_retry_times: msg = ('Async task {} reaches max retry times, ' 'status changes to FAILED').format(row.task_id) handler.save(status=FAILED, finished_time=date.now(), message=msg) log.info(msg) return if row.startup_time and row.startup_time<=now or not row.startup_time: #处理父结点,如果current_status为成功,则不执行 if row.children_count > 0 and row.current_status == SUCCESS: return handler.save(status=STARTED, started_time=date.now(), retry_times=row.retry_times+1) log.info('Async task {0} [{1}({2!r})] started, retry_times={3}'.format( row.task_id, row.command_name, row.command_info.get('parameters', ''), row.retry_times)) run_command(row)
def post_save(obj, data): from uliweb import functions from uliweb.utils.common import Serial from uliweb.mail import Mail Post.filter(Post.c.id == int(parent_id)).update( num_replies=Post.c.num_replies + 1, last_post_user=request.user.id, last_reply_on=date.now() ) self._clear_files(obj.slug, data["content"]) Topic.filter(Topic.c.id == int(topic_id)).update( num_replies=Topic.c.num_replies + 1, last_post_user=request.user.id, last_reply_on=date.now(), last_post=obj.id, ) Forum.filter(Forum.c.id == int(forum_id)).update( num_posts=Forum.c.num_posts + 1, last_post_user=request.user.id, last_reply_on=date.now(), last_post=obj.id, ) # 増加发送邮件的处理 emails = [] for u_id in Post.filter( (Post.c.topic == int(topic_id)) & (Post.c.reply_email == True) & (Post.c.id == parent_id) ).values(Post.c.posted_by): user = User.get(u_id[0]) if user and user.email and (user.email not in emails) and (user.email != request.user.email): emails.append(user.email) if not emails: return _type = settings.get_var("PARA/FORUM_REPLY_PROCESS", "print") url = "%s/forum/%s/%s" % (settings.get_var("PARA/DOMAIN"), forum_id, topic_id) d = {"url": str(url)} mail = { "from_": settings.get_var("PARA/EMAIL_SENDER"), "to_": emails, "subject": settings.get_var("FORUM_EMAIL/FORUM_EMAIL_TITLE"), "message": settings.get_var("FORUM_EMAIL/FORUM_EMAIL_TEXT") % d, "html": True, } if _type == "mail": Mail().send_mail(**mail) elif _type == "print": print mail elif _type == "redis": redis = functions.get_redis() _t = Serial.dump(mail) redis.lpush("send_mails", _t)
def run(self): import traceback Task = functions.get_model('async_Tasks') try: self.before() if not self.func: self.ret = 'empty' self.log.debug("Async task {} function is empty".format(self.task_id)) else: f = import_attr(self.func) self.log.debug("Run Async task {} function {!r}({!r})".format( self.task_id, f, self.parameters)) #_args表示位置参数 args = self.parameters.pop('_args', ()) self.ret = f(*args, **self.parameters) self.log.debug("Execute {!r} with {!r} and the result is {!r}".format( f, self.parameters, self.ret)) self.on_finish() self.after() self.save() except Exception as e: type, value, tb = sys.exc_info() txt = ''.join(traceback.format_exception(type, value, tb)) if self.task.retry_times >= self.task.max_retry_times: status = FAILED finished_time = date.now() startup_time = self.task.startup_time msg = 'Async task {} reaches max retry times, status changes to FAILED'.format(self.task.task_id) self.log.info(msg) else: status = ERROR startup_time = (date.now() + datetime.timedelta(milliseconds=self.task.retry_time_interval*(self.task.retry_times-1))) finished_time = None msg = 'Async task {} runs on error, it will startup at {}'.format(self.task.task_id, startup_time) self.log.info(msg) self.save(execution_info=txt, finished_time=finished_time, startup_time=startup_time, status=status, message=msg) self.log.exception(e)
def post_save(obj, data): #更新Post表 post.content = data['content'] post.updated_on = date.now() post.save() self._clear_files(obj.slug, data['content'])
def commit(self, session=None): Task = functions.get_model('async_tasks') if session: Task = Task.use(session) if self.parent_task and isinstance(self.parent_task, AsyncCommand): parent_task_id = self.parent_task.task_id else: parent_task_id = self.parent_task task = Task(task_id=self.task_id, title=self.title, parent_task=parent_task_id, children_count=len(self.tasks), command_name=self.name, command_info=self._make_info(), depend_tasks=self.depend_tasks, startup_time=self.startup_time or date.now(), timeout=self.timeout, max_retry_times=self.max_retry_times, retry_time_interval=self.retry_time_interval, user_id=self.user_id, src_ip=self.src_ip, correlation=self.correlation, correlation_link=self.correlation_link) task.update(**self.kwargs) task.save() self.task = task #commit child tasks for t in self.tasks.values(): t.commit() log.info('Commit a task %s' % self.task_id) return task
def parse_function(self, f): args = inspect.getargspec(f)[0] if args: args = ['<%s>' % x for x in args] if f.__name__ in reserved_keys: raise ReservedKeyError, 'The name "%s" is a reversed key, so please change another one' % f.__name__ appname, path = self._get_path(f) if self.rule is None: if self.restful: rule = '/' + '/'.join([path] + args[:1] + [f.__name__] + args[1:]) else: rule = '/' + '/'.join([path, f.__name__] + args) else: rule = self.rule rule = self._fix_url(appname, rule) if inspect.ismethod(f): endpoint = '.'.join([f.im_class.__module__, f.im_class.__name__, f.__name__]) else: endpoint = '.'.join([f.__module__, f.__name__]) f.func_dict['__exposed__'] = True f.func_dict['__no_rule__'] = (self.parse_level == 1) or (self.parse_level == 2 and (self.rule is None)) if not hasattr(f, '__old_rule__'): f.func_dict['__old_rule__'] = {} f.func_dict['__old_rule__'][rule] = self.rule #add name parameter process if 'name' in self.kwargs: url_name = self.kwargs.pop('name') __url_names__[url_name] = endpoint return f, (appname, endpoint, rule, self.kwargs.copy(), now())
def enroll(self): """ 报名处理 """ issue = int(request.POST.get('issue')) class_id = int(request.POST.get('class_id')) obj = self.model_issue.get(and_( self.model_issue.c.class_obj == class_id, self.model_issue.c.issue == issue), for_update=True) row = self._get_student(obj) if row and not row.deleted: return json({'success': False, 'message': '你已经报过名了!'}) if obj.students_num < obj.need_num: obj.students_num += 1 obj.save() if not row: row = self.model_study( issue=issue, class_obj=class_id, student=request.user.id, ) else: row.deleted = False row.create_date = now() row.save() d = obj.to_dict() d['enrolled'] = True return json({'success': True, 'message': '报名成功!', 'data': d}) else: return json({'success': False, 'message': '对不起,报名人数已经满了,请等下期再报名!'})
def reset(self, force=False, log=None): """ :param force: True will reset without condition, False will only reset for Failed, Error, Cancel status """ from . import SUCCESS, STARTED, QUEUED now = date.now() task = self if force or (not force and task.status != SUCCESS and (task.status != STARTED or task.status == STARTED and task.started_time + datetime.timedelta(milliseconds=task.timeout) > now)): task.status = QUEUED task.retry_times = 0 task.startup_time = None task.execution_info = '' task.message = 'The task is reset' handler = self.get_handler(log=log) handler.save() #处理子结点 for t in self.tasks: t.reset(force=force, log=log) return True else: return False
def post_save(obj, data): from sqlalchemy.sql import select, func Post = get_model("forumpost") p = Post( topic=obj.id, posted_by=request.user, slug=obj.slug, content=data["content"], floor=1, reply_email=data["reply_email"], ) p.save() obj.last_post = p.id obj.save() Forum.filter(Forum.c.id == int(id)).update( num_posts=Forum.c.num_posts + 1, num_topics=Forum.c.num_topics + 1, last_post_user=request.user.id, last_reply_on=date.now(), last_post=p.id, ) # 根据slug的值清除附件中无效的文件 self._clear_files(obj.slug, data["content"])
def delete_chapter(self, id): """ 删除章节 删除时,如果有子结点,则子结点的父结点应变成当前结点的父结点 """ obj = self.model_chapters.get_or_notfound(int(id)) tutorial = obj.tutorial count = obj.comments_count parent = obj._parent_ #修改所有子结点的父结点 obj.children_chapters.update(parent=parent) #删除章节顺序cache cache = functions.get_cache() cache.delete(self._get_tutorial_chapters_cache_key(obj._tutorial_)) #删除当前章节 obj.deleted = True obj.modified_user = request.user.id obj.modified_date = date.now() obj.save() #删除所属教程的评论数目 tutorial.comments_count = max(0, tutorial.comments_count - count) tutorial.save() #跳转回教程展示页面 return redirect(url_for(TutorialView.read, id=tutorial.id))
def start_task(task_id, now=None): from uliweb.utils import date now = now or date.now() try: task = functions.get_object('cron_task', task_id) log.info(u'Starting task [{title}] at {now}'.format(title=task.label, now=now)) d = parse_command(task) c = functions.AsyncCommand( title=task.label, category='cron', message_source='l', correlation=task.id, queue=(task.queue or 'default').split(','), timeout=task.timeout or None, # correlation_link='/async_task/view/{0}?next=/cron/{1}'.format(job.id, obj.id) **d ) functions.call_async(c) return c except Exception as e: log.exception(e) raise
def move(self): import json as _json from uliweb.utils.date import now data = request.POST.get('data') d = _json.loads(data) for row in d['updated']: obj = self.model.get(row['id']) if not obj: return json({ 'success': False, 'message': '记录丢失 {}'.format(row['id']) }) x = {} x['parent'] = row['parent'] x['order'] = row['order'] x['level'] = row['level'] x['has_children'] = row.get('has_children', 0) obj.modified_user = request.user.id obj.modified_time = now() obj.update(**x) obj.save() obj.clear_menu() return json({'success': True, 'message': '处理成功'})
def run_command(row): import json from uliweb import settings keys_queue = settings.get_var('ASYNC_TASKS/tasks_keys_queue') kw = row.command_info.copy() kw['task_id'] = row.task_id queue =kw['queue'] try: redis = functions.get_redis() if not isinstance(queue, (tuple, list)): queue = [queue] msg = json.dumps(kw) #在添加消息到公共队列的同时,将任务ID添加到keys_queue中,用来记录当前将要,或正在执行的任务 for q in queue: pipe = redis.pipeline() name = settings.ASYNC_TASKS_QUEUES.get(q or 'default') or q pipe.lpush(name, msg).sadd(keys_queue, row.task_id) pipe.execute() log.info('Put task_id {} to queue=[{}] and keys_queue=[{}]'.format(row.task_id, name, keys_queue)) except Exception as e: _type, value, tb = sys.exc_info() txt = ''.join(traceback.format_exception(_type, value, tb)) handler = row.get_handler(log=log) handler.save(status=ERROR, execution_info=txt, finished_time=date.now()) log.error('Run async task {} failed when push with redis'.format(row.task_id)) log.exception(e)
def enroll(self): """ 报名处理 """ issue = int(request.POST.get('issue')) class_id = int(request.POST.get('class_id')) obj = self.model_issue.get( and_(self.model_issue.c.class_obj==class_id, self.model_issue.c.issue==issue), for_update=True) row = self._get_student(obj) if row and not row.deleted: return json({'success':False, 'message':'你已经报过名了!'}) if obj.students_num < obj.need_num: obj.students_num += 1 obj.save() if not row: row = self.model_study( issue=issue, class_obj=class_id, student=request.user.id, ) else: row.deleted = False row.create_date = now() row.save() d = obj.to_dict() d['enrolled'] = True return json({'success':True, 'message':'报名成功!', 'data':d}) else: return json({'success':False, 'message':'对不起,报名人数已经满了,请等下期再报名!'})
def start_task(task_id, now=None): from uliweb.utils import date now = now or date.now() try: task = functions.get_object('cron_task', task_id) log.info(u'Starting task [{title}] at {now}'.format(title=task.label, now=now)) d = parse_command(task) c = functions.AsyncCommand( title=task.label, category='cron', message_source='l', correlation=task.id, queue=(task.queue or 'default').split(','), timeout=task.timeout or None, # correlation_link='/async_task/view/{0}?next=/cron/{1}'.format(job.id, obj.id) **d) functions.call_async(c) return c except Exception as e: log.exception(e) raise
def clean_dir(self, dir, extensions, exclude_extensions, recursion, days, pattern, verbose=False, test=False): from uliweb.utils.common import walk_dirs import datetime from uliweb.utils import date import shutil now = date.now() i = 0 for f in walk_dirs(dir, include_ext=extensions, exclude_ext=exclude_extensions, recursion=recursion, file_only=False, use_default_pattern=False, patterns=pattern): t = datetime.datetime.fromtimestamp(os.path.getmtime(f)) if not days or (days and (now-t).days >= days): try: if os.path.isfile(f): if not test: os.unlink(f) if test or verbose: print 'Clean filename {}...'.format(f) else: if not test: shutil.rmtree(f) if test or verbose: print 'Clean directory {}...'.format(f) i += 1 except: import traceback traceback.print_exc() print 'Cleaned {} files'.format(i)
def clean_dir(self, dir, extensions, exclude_extensions, recursion, days, verbose=False): from uliweb.utils.common import walk_dirs import datetime from uliweb.utils import date now = date.now() i = 0 for f in walk_dirs(dir, include_ext=extensions, exclude_ext=exclude_extensions, recursion=recursion, file_only=True, use_default_pattern=False): t = datetime.datetime.fromtimestamp(os.path.getmtime(f)) if not days or (days and (now - t).days >= days): try: os.unlink(f) if verbose: print 'Clean filename {}...'.format(f) i += 1 except: import traceback traceback.print_exc() print 'Cleaned {} files'.format(i)
def delete_chapter(self, id): """ 删除章节 删除时,如果有子结点,则子结点的父结点应变成当前结点的父结点 """ obj = self.model_chapters.get_or_notfound(int(id)) tutorial = obj.tutorial count = obj.comments_count parent = obj._parent_ #修改所有子结点的父结点 obj.children_chapters.update(parent=parent) #删除章节顺序cache cache = functions.get_cache() cache.delete(self._get_tutorial_chapters_cache_key(obj._tutorial_)) #删除当前章节 obj.deleted = True obj.modified_user = request.user.id obj.modified_date = date.now() obj.save() #删除所属教程的评论数目 tutorial.comments_count = max(0, tutorial.comments_count-count) tutorial.save() #跳转回教程展示页面 return redirect(url_for(TutorialView.read, id=tutorial.id))
def run_command(row): import json from uliweb import settings keys_queue = settings.get_var('ASYNC_TASKS/tasks_keys_queue') kw = row.command_info.copy() kw['task_id'] = row.task_id queue = kw['queue'] try: redis = functions.get_redis() if not isinstance(queue, (tuple, list)): queue = [queue] msg = json.dumps(kw) #在添加消息到公共队列的同时,将任务ID添加到keys_queue中,用来记录当前将要,或正在执行的任务 for q in queue: pipe = redis.pipeline() name = settings.ASYNC_TASKS_QUEUES.get(q or 'default') or q pipe.lpush(name, msg).sadd(keys_queue, row.task_id) pipe.execute() log.info('Put task_id {} to queue=[{}] and keys_queue=[{}]'.format( row.task_id, name, keys_queue)) except Exception as e: _type, value, tb = sys.exc_info() txt = ''.join(traceback.format_exception(_type, value, tb)) handler = row.get_handler(log=log) handler.save(status=ERROR, execution_info=txt, finished_time=date.now()) log.error('Run async task {} failed when push with redis'.format( row.task_id)) log.exception(e)
def on_finish(self): """ 在处理成功后执行此处理,如果返回True,表示不执行缺省处理,否则按缺省处理进行 :param ret: 命令执行结果 :return: """ #增加对返回值的处理,当self.ret返回为AsyncCommandList时,将当前任务置为 #父结点,增加关联的子结点 #动态生成的父任务 if isinstance(self.ret, AsyncCommandList): self.ret.commit(self.task) self.task.children_count = len(self.ret.tasks) self.task.current_status = SUCCESS self.task.status = STARTED self.task.execution_info=safe_str(self.ret.result) #处理父任务 elif self.task.children_count > 0: self.task.current_status = SUCCESS self.task.status = STARTED self.task.execution_info=safe_str(self.ret) #一般任务 else: self.task.status = SUCCESS self.task.finished_time = date.now() self.task.execution_info = safe_str(self.ret)
def save(self): import json as json_lib from uliweb.utils import date data = json_lib.loads(request.POST['data']) ids = {0: 0} objs = [] #先将所有记录置为删除状态 self.model.all().update(deleted=True) for row in data: d = { 'name': row['name'], 'parent': ids[row['parent']], 'order': row['order'], 'deleted': False, 'modified_time': date.now(), 'modified_user': request.user.id } if not row['id'].isdigit(): #新记录 obj = self.model(**d) else: obj = self.model.get(int(row['id'])) obj.update(**d) obj.save() ids[row['id']] = obj.id self.model.filter(self.model.c.deleted == True).remove() return json({'success': True, 'message': '保存成功!'})
def api_login(self): lpsust = request.values.get(settings.AUTH_LENOVOID.LENOVOID_WUST_NAME) rememberme = request.values.get("rememberme") if rememberme: rememberme = (rememberme.lower()=="true") or (rememberme=='1') if lpsust: f,d = authenticate(lpsust=lpsust) if f: from uliweb.utils.date import now user = d user.last_login = now() user.save() request.user = user session = functions.get_session() session[settings.AUTH_LENOVOID.SESSION_KEY_USER] = user.id if session.deleted: session.delete() else: if rememberme: timeout = settings.SESSION.remember_me_timeout session.set_expiry(timeout) else: timeout = settings.SESSION.timeout flag = session.save() return json({ settings.AUTH_LENOVOID.TOKEN_NAME: session.key, "timeout":timeout, } ) else: return json({"error_message": d.get("error_message")}, status = d.get("error_code")) return json({"error_message":"Fail to log in."}, status = 400)
def output(): while self.process.poll() is None: line = self.process.stdout.readline().rstrip() self.process.timestamp = now() self.output('return', self.server.safe_encode(line)) self.output('cwd', self.server.safe_encode(self.old_cwd)) self.status = 1 #finished
def get_exe_time(job): import croniter from uliweb import settings now = date.now(settings.CRON.TIMEZONE) cron = croniter.croniter(job.time, now) return cron.get_next()
def post_save(obj, data): obj.tutorial.modified_date = date.now() obj.tutorial.modified_user = request.user.id obj.tutorial.save(); #删除章节顺序cache cache = functions.get_cache() cache.delete(self._get_tutorial_chapters_cache_key(int(t_id)))
def post_save(obj, data): obj.tutorial.modified_date = date.now() obj.tutorial.modified_user = request.user.id obj.tutorial.save() #删除章节顺序cache cache = functions.get_cache() cache.delete(self._get_tutorial_chapters_cache_key(int(t_id)))
def _upload_file(self, image=False): import os import Image from uliweb.contrib.upload import get_url, save_file, get_filename if image: from forms import ImageUploadForm as Form else: from forms import FileUploadForm as Form from uliweb.utils.image import thumbnail_image, fix_filename File = get_model("forumattachment") forum_id = request.GET.get("forum_id") slug = request.GET.get("slug") form = Form() suffix = date.now().strftime("_%Y_%m_%d") if request.method == "GET": form.bind({"is_thumbnail": True}) return {"form": form} else: flag = form.validate(request.values, request.files) if flag: f = form.data["filedata"] _f = os.path.basename(f["filename"]) # 文件格式为forum/<forum_id>/<filename_yyyy_mm_dd> filename = fix_filename("forum/%s/%s" % (forum_id, _f), suffix) if image: filename = save_file(filename, f["file"]) if form.data["is_thumbnail"]: # process thumbnail rfilename, thumbnail = thumbnail_image( get_filename(filename, filesystem=True), filename, settings.get_var("PARA/FORUM_THUMBNAIL_SIZE"), ) _file = get_url(thumbnail) else: _file = get_url(filename) name = get_url(filename) else: filename = save_file(filename, f["file"]) _file = get_url(filename) name = form.data["title"] if not name: name = _f ff = File(slug=slug, file_name=filename, name=name) ff.save() return """<script type="text/javascript"> var url='%s||%s'; setTimeout(function(){callback(url);},100); </script> """ % ( _file, name, ) else: return {"form": form}
def _upload_file(self, image=False, show_filename=True): import os import Image if image: from forms import ImageUploadForm as Form else: from forms import FileUploadForm as Form from uliweb.utils.image import thumbnail_image, fix_filename from uliweb import json_dumps File = get_model('forumattachment') forum_id = request.GET.get('forum_id') slug = request.GET.get('slug') form = Form() suffix = date.now().strftime('_%Y_%m_%d') if request.method == 'GET': form.bind({'is_thumbnail': True}) return {'form': form} else: flag = form.validate(request.values, request.files) if flag: f = form.data['filedata'] _f = os.path.basename(f['filename']) #文件格式为forum/<forum_id>/<filename_yyyy_mm_dd> filename = fix_filename('forum/%s/%s' % (forum_id, _f), suffix) if image: filename = functions.save_file(filename, f['file']) if form.data['is_thumbnail']: #process thumbnail rfilename, thumbnail = thumbnail_image( functions.get_filename(filename, filesystem=True), filename, settings.get_var('PARA/FORUM_THUMBNAIL_SIZE')) _file = functions.get_href(thumbnail) else: _file = functions.get_href(filename) name = functions.get_href(filename) else: filename = functions.save_file(filename, f['file']) name = form.data['title'] if not name: name = _f _file = functions.get_href(filename, alt=name) ff = File(slug=slug, file_name=filename, name=name) ff.save() name = json_dumps(name, unicode=True) if show_filename: fargs = '||%s' % name[1:-1] else: fargs = '' return '''<script type="text/javascript"> var url='%s%s'; setTimeout(function(){callback(url);},100); </script> ''' % (_file, fargs) else: return {'form': form}
def post_save(obj, data): from uliweb import functions from uliweb.utils.common import Serial from uliweb.mail import Mail Post.filter(Post.c.id==int(parent_id)).update(num_replies=Post.c.num_replies+1, last_post_user=request.user.id, last_reply_on=date.now()) self._clear_files(obj.slug, data['content']) Topic.filter(Topic.c.id==int(topic_id)).update( num_replies=Topic.c.num_replies+1, last_post_user=request.user.id, last_reply_on=date.now(), last_post=obj.id) Forum.filter(Forum.c.id==int(forum_id)).update( num_posts=Forum.c.num_posts+1, last_post_user=request.user.id, last_reply_on=date.now(), last_post=obj.id) #増加发送邮件的处理 emails = [] for u_id in Post.filter((Post.c.topic==int(topic_id)) & (Post.c.reply_email==True) & (Post.c.id==parent_id)).values(Post.c.posted_by): user = User.get(u_id[0]) if user and user.email and (user.email not in emails) and (user.email!=request.user.email): emails.append(user.email) if not emails: return _type = settings.get_var('PARA/FORUM_REPLY_PROCESS', 'print') url = '%s/%s/%s' % (settings.get_var('PARA/DOMAIN'), forum_id, topic_id) d = {'url':str(url)} mail = {'from_':settings.get_var('PARA/EMAIL_SENDER'), 'to_':emails, 'subject':settings.get_var('FORUM_EMAIL/FORUM_EMAIL_TITLE'), 'message':settings.get_var('FORUM_EMAIL/FORUM_EMAIL_TEXT') % d, 'html':True} if _type == 'mail': Mail().send_mail(**mail) elif _type == 'print': print mail elif _type == 'redis': redis = functions.get_redis() _t = Serial.dump(mail) redis.lpush('send_mails', _t)
def post_save(obj, data): t = obj.chapter.tutorial t.last_comment_user = request.user.id t.last_comment_date = date.now() t.comments_count += 1 t.save() obj.chapter.comments_count += 1 obj.chapter.save()
def pre_save(obj, data): # data['content'] = self._prepare_content(data['content'], data['render']) data['html'] = self._get_chapter_html(data['content'], data['format'], data['render'], data['scrollable']) data['chars_count'] = len(data['content']) data['modified_date'] = date.now() data['modified_user'] = request.user.id
def post_save(obj, data): obj.tutorial.modified_date = date.now() obj.tutorial.modified_user = request.user.id obj.tutorial.save(); #删除章节顺序cache if old_title != obj.title: cache = functions.get_cache() cache.delete(self._get_tutorial_chapters_cache_key(obj._tutorial_))
def post_save(obj, data): obj.tutorial.modified_date = date.now() obj.tutorial.modified_user = request.user.id obj.tutorial.save() #删除章节顺序cache if old_title != obj.title: cache = functions.get_cache() cache.delete( self._get_tutorial_chapters_cache_key(obj._tutorial_))
def _upload_file(self, image=False, show_filename=True): import os import Image if image: from forms import ImageUploadForm as Form else: from forms import FileUploadForm as Form from uliweb.utils.image import thumbnail_image, fix_filename from uliweb import json_dumps File = get_model('forumattachment') forum_id = request.GET.get('forum_id') slug = request.GET.get('slug') form = Form() suffix = date.now().strftime('_%Y_%m_%d') if request.method == 'GET': form.bind({'is_thumbnail':True}) return {'form':form} else: flag = form.validate(request.values, request.files) if flag: f = form.data['filedata'] _f = os.path.basename(f['filename']) #文件格式为<forum_id>/<filename_yyyy_mm_dd> filename = fix_filename('%s/%s' % (forum_id, _f), suffix) if image: filename = functions.save_file(filename, f['file']) if form.data['is_thumbnail']: #process thumbnail rfilename, thumbnail = thumbnail_image(functions.get_filename(filename, filesystem=True), filename, settings.get_var('PARA/FORUM_THUMBNAIL_SIZE')) _file = functions.get_href(thumbnail) else: _file = functions.get_href(filename) name = functions.get_href(filename) else: filename = functions.save_file(filename, f['file']) name = form.data['title'] if not name: name = _f _file = functions.get_href(filename, alt=name) ff = File(slug=slug, file_name=filename, name=name) ff.save() name = json_dumps(name, unicode=True) if show_filename: fargs = '||%s' % name[1:-1] else: fargs = '' return '''<script type="text/javascript"> var url='%s%s'; setTimeout(function(){callback(url);},100); </script> ''' % (_file, fargs) else: return {'form':form}
def start_job(job, now=None): from uliweb.utils import date now = now or date.now() log.info(u'Starting job [{title} -- {time}] at {now}'.format( title=job.title, now=now, time=job.time)) Task = functions.get_model('cron_task') Begin() try: parent = functions.AsyncCommand( '', title=job.title, startup_time=now, category='cron', message_source='l', timeout=job.timeout, #todo add correlation to job ) commands = [] ids = {} #process task for row in Task.filter(Task.c.cron_job == job.id): #process async task d = parse_command(row) c = functions.AsyncCommand( title=row.label, category='cron', message_source='l', correlation=job.id, queue=(row.queue or 'default').split(','), timeout=row.timeout or None, # correlation_link='/async_task/view/{0}?next=/cron/{1}'.format(job.id, obj.id) **d) commands.append((c, row.depend_tasks)) ids[row.id] = c.task_id parent.add_child(c) #fix depends for c, depends in commands: _d = [ids[x] for x in depends] c.depend_tasks = _d functions.call_async(parent) job.instances.add(parent.task_id) Commit() except Exception as e: Rollback() log.exception(e) raise
def pre_save(obj, data): flag = False if data["topic_type"] != obj.topic_type: flag = True if not flag and data["subject"] != obj.subject: flag = True if not flag and data["content"] != safe_str(post.content): flag = True if flag: data["modified_user"] = request.user.id data["updated_on"] = date.now()
def start_job(job, now=None): from uliweb.utils import date now = now or date.now() log.info(u'Starting job [{title} -- {time}] at {now}'.format(title=job.title, now=now, time=job.time)) Task = functions.get_model('cron_task') Begin() try: parent = functions.AsyncCommand('', title=job.title, startup_time=now, category='cron', message_source='l', timeout=job.timeout, #todo add correlation to job ) commands = [] ids = {} #process task for row in Task.filter(Task.c.cron_job==job.id): #process async task d = parse_command(row) c = functions.AsyncCommand( title=row.label, category='cron', message_source='l', correlation=job.id, queue=(row.queue or 'default').split(','), timeout=row.timeout or None, # correlation_link='/async_task/view/{0}?next=/cron/{1}'.format(job.id, obj.id) **d ) commands.append((c, row.depend_tasks)) ids[row.id] = c.task_id parent.add_child(c) #fix depends for c, depends in commands: _d = [ids[x] for x in depends] c.depend_tasks = _d functions.call_async(parent) job.instances.add(parent.task_id) Commit() except Exception as e: Rollback() log.exception(e) raise
def pre_save(obj, data): flag = False if data['topic_type'] != obj.topic_type: flag = True if not flag and data['subject'] != obj.subject: flag = True if not flag and data['content'] != safe_str(post.content): flag = True if flag: data['modified_user'] = request.user.id data['updated_on'] = date.now()
def signal_handler(self, signum, frame): from . import ERROR from uliweb.utils import date msg = "Process {} received a signal {}".format(self.pid, signum) self.log.info(msg) if self.handler: self.handler.save(status=ERROR, execution_info=msg, finished_time=date.now()) self.clear_entry() sys.exit(0)
def pre_save(data): if 'parent' in request.GET: data['parent'] = int(request.GET.get('parent')) data['tutorial'] = int(t_id) order, = self.model_chapters.filter(self.model_chapters.c.tutorial==int(t_id)).values_one(func.max(self.model_chapters.c.order)) data['order'] = order+1 if order>0 else 1 # data['content'] = self._prepare_content(data['content'], data['render']) data['html'] = self._get_chapter_html(data['content'], data['format'], data['render'], data['scrollable']) data['chars_count'] = len(data['content']) data['modified_date'] = date.now() data['modified_user'] = request.user.id data['format'] = '2'
def start(self, id): from .daemon import start_job from uliweb.utils import date try: obj = functions.get_object('cron_job', int(id)) now = date.now() start_job(obj, now) flash('启动作业 {} 成功'.format(id)) except Exception as e: log.exception(e) flash('启动作业 {} 失败'.format(id), 'error') return redirect('/cron/{}'.format(id))
def output(): while self.process.poll() is None: b = time.time() while 1: line = self.process.stdout.readline() if line: self.process.timestamp = now() self.output('data', self.server.safe_encode(line.rstrip())) else: if time.time() - b > 0.5: break self.output('cwd', self.server.safe_encode(self.old_cwd)) self.status = 1 #finished
def form_validate(self, data): from croniter import croniter from uliweb.utils import date errors = {} if 'time' in data: t = data['time'] try: croniter(data['time'], date.now()) except Exception as e: errors['time'] = 'Crontab 时间格式不正确' return errors
def parse_function(self, f): args = inspect.getargspec(f)[0] if args: args = ['<%s>' % x for x in args] if f.__name__ in reserved_keys: raise ReservedKeyError( 'The name "%s" is a reversed key, so please change another one' % f.__name__) appname, path = self._get_path(f) if self.rule is None: if self.restful: rule = '/' + '/'.join([path] + args[:1] + [f.__name__] + args[1:]) else: rule = '/' + '/'.join([path, f.__name__] + args) else: self.rule = self._fix_route(self.rule) rule = self.rule fixed_url = rule.startswith('!') rule = self._fix_url(appname, rule) #get endpoint clsname = '' if inspect.ismethod(f): if not f.im_self: #instance method clsname = f.im_class.__name__ else: #class method clsname = f.im_self.__name__ endpoint = '.'.join([f.im_class.__module__, clsname, f.__name__]) elif inspect.isfunction(f): endpoint = '.'.join([f.__module__, f.__name__]) else: endpoint = f f.func_dict['__exposed__'] = True f.func_dict['__no_rule__'] = (self.parse_level == 1) or (self.parse_level == 2 and (self.rule is None)) if not hasattr(f, '__old_rule__'): f.func_dict['__old_rule__'] = {} f.func_dict['__old_rule__'][rule] = self.rule f.func_dict['__old_rule__']['clsname'] = clsname f.func_dict['__template__'] = self.template f.func_dict['__layout__'] = self.layout f.func_dict['__fixed_url__'] = fixed_url kw = self.kwargs.copy() self._fix_kwargs(appname, kw) return f, (appname, endpoint, rule, kw, now())
def actions(value, obj): if not request.user: return '' a = [] is_manager = forum.managers.has(request.user) if obj.floor == 1 and obj.parent == None: #第一楼为主贴,可以允许关闭,顶置等操作 if is_manager: a.append('<a href="#" rel="%d" class="close">%s</a>' % (obj.id, self.status['close'][obj.topic.closed])) a.append('<a href="#" rel="%d" class="hidden">%s</a>' % (obj.id, self.status['hidden'][obj.topic.hidden])) a.append('<a href="#" rel="%d" class="top">%s</a>' % (obj.id, self.status['sticky'][obj.topic.sticky])) a.append( '<a href="#" rel="%d" class="essence">%s</a>' % (obj.id, self.status['essence'][obj.topic.essence])) a.append( '<a href="#" rel="%d" class="homepage">%s</a>' % (obj.id, self.status['homepage'][obj.topic.homepage])) if is_manager or ( obj.posted_by.id == request.user.id and obj.created_on + timedelta(days=settings.get_var( 'PARA/FORUM_EDIT_DELAY')) >= date.now()): #作者或管理员且在n天之内,则可以编辑 url = url_for(ForumView.edit_topic, forum_id=forum_id, topic_id=topic_id) a.append('<a href="%s" rel="%d" class="edit">编辑</a>' % (url, obj.id)) if is_manager: url = url_for(ForumView.remove_topic, forum_id=forum_id, topic_id=topic_id) a.append( '<a href="%s" rel="%d" class="delete_topic">删除主题</a>' % (url, obj.id)) if is_manager or (obj.posted_by.id == request.user.id): if (obj.deleted and (obj.deleted_by.id == request.user.id or is_manager)) or not obj.deleted: a.append('<a href="#" rel="%d" class="delete">%s</a>' % (obj.id, self.status['delete'][obj.deleted])) if obj.posted_by.id == request.user.id: a.append('<a href="#" rel="%d" class="email">%s</a>' % (obj.id, self.status['email'][obj.reply_email])) a.append('<a href="/forum/%d/%d/%d/new_reply">回复该作者</a>' % (forum_id, topic_id, obj.id)) return ' | '.join(a)
def _wiki_update_editor(self, pagename): """ 更新当前页面的编辑用户及时间 """ wiki = self.model.get(self.model.c.name == pagename) if wiki: #check read permission self._check_permission('edit', wiki, page=wiki) wiki.cur_user = request.user.id wiki.start_time = date.now() wiki.save() return json({'success':True}) else: return json({'success':False, 'message':'页面不存在'})
def clean_dir(self, dir, extensions, days, verbose=False): from uliweb.utils.common import walk_dirs import datetime from uliweb.utils import date if verbose: print 'Clean {}...'.format(dir) now = date.now() for f in walk_dirs(dir, include_ext=extensions): t = datetime.datetime.fromtimestamp(os.path.getmtime(f)) if not days or (days and (now - t).days >= days): try: os.unlink(f) except: import traceback traceback.print_exc()
def save(self, relative_model=None): """ 保存category,同时根据relative_model删除对应的分类下的记录 """ import json as json_lib from uliweb import request from uliweb.utils import date data = json_lib.loads(request.POST['data']) ids = {0: 0} objs = [] #记录更新的记录 #先将所有记录置为删除状态 self.model.all().update(deleted=True) for row in data: d = { 'name': row['name'], 'parent': ids[row['parent']], 'order': row['order'], 'deleted': False, 'modified_time': date.now(), 'modified_user': request.user.id } flag = '' if not row['id'].isdigit(): #新记录 flag = 'new' else: obj = self.model.get(int(row['id'])) if not obj: flag = 'new' if flag == 'new': obj = self.model(**d) else: obj.update(**d) obj.save() objs.append(obj.to_dict()) ids[row['id']] = obj.id self.model.filter(self.model.c.deleted == True).remove() if relative_model: R = functions.get_model(relative_model) for row in self.model.filter(self.model.c.deleted == True): R.filter(R.c.category == row.id).update(category=0) row.remove() return json({'success': True, 'message': '保存成功!', 'data': objs})
def _enroll(self, obj): """ 报名状态:-2 已结束 -1 未登录 -3 人员已满, 1 已经报名 0 尚未报名 """ if obj.need_num == obj.students_num: return -3 date = now() if date >= obj.begin_date: return -2 if not request.user: return -1 row = self._get_student(obj) if row and row.deleted == False: return 0 else: return 1
def login(username): """ return user """ from uliweb.utils.date import now from uliweb import request User = get_model('user') if isinstance(username, string_types): user = User.get(User.c.username==username) else: user = username user.last_login = now() user.save() set_user_session(user) return True
def pre_save(data): if 'parent' in request.GET: data['parent'] = int(request.GET.get('parent')) data['tutorial'] = int(t_id) order, = self.model_chapters.filter( self.model_chapters.c.tutorial == int(t_id)).values_one( func.max(self.model_chapters.c.order)) data['order'] = order + 1 if order > 0 else 1 # data['content'] = self._prepare_content(data['content'], data['render']) data['html'] = self._get_chapter_html(data['content'], data['format'], data['render'], data['scrollable']) data['chars_count'] = len(data['content']) data['modified_date'] = date.now() data['modified_user'] = request.user.id data['format'] = '2'
def cancel(self, message='', process_child=False, log=None): """ 只处理状态为QUEUE, ERROR的记录,其它的不处理 """ from . import CANCEL, QUEUED, ERROR if self.status in (QUEUED, ERROR): self.status = CANCEL self.finished_time = date.now() self.message = message handler = self.get_handler(log=log) handler.save() if process_child: #处理子结点 for t in self.tasks: t.cancel(message, process_child, log)