Exemple #1
0
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)
Exemple #2
0
        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)
Exemple #3
0
    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)
Exemple #4
0
 def post_save(obj, data):
     #更新Post表
     post.content = data['content']
     post.updated_on = date.now()
     post.save()
     
     self._clear_files(obj.slug, data['content'])
Exemple #5
0
    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
Exemple #6
0
 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())
Exemple #7
0
    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': '对不起,报名人数已经满了,请等下期再报名!'})
Exemple #8
0
    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
Exemple #9
0
        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"])
Exemple #10
0
    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))
Exemple #11
0
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
Exemple #12
0
    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': '处理成功'})
Exemple #13
0
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)
Exemple #14
0
    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':'对不起,报名人数已经满了,请等下期再报名!'})
Exemple #15
0
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
Exemple #16
0
    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)
Exemple #17
0
    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)
Exemple #18
0
 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))
Exemple #19
0
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)
Exemple #20
0
 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': '保存成功!'})
Exemple #22
0
    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)
Exemple #23
0
 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
Exemple #24
0
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()
Exemple #25
0
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()
Exemple #26
0
 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)))
Exemple #27
0
        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)))
Exemple #28
0
    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}
Exemple #29
0
    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}
Exemple #30
0
 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)
Exemple #31
0
        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()
Exemple #32
0
 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
Exemple #33
0
 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_))
Exemple #34
0
 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()
Exemple #35
0
        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_))
Exemple #36
0
    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}
Exemple #37
0
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
Exemple #38
0
 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()
Exemple #39
0
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
Exemple #40
0
 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()
Exemple #41
0
 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()
Exemple #42
0
    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)
Exemple #43
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'
Exemple #44
0
    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))
Exemple #45
0
    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
Exemple #47
0
    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
Exemple #48
0
 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
Exemple #49
0
    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())
Exemple #50
0
    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
Exemple #51
0
        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)
Exemple #52
0
 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':'页面不存在'})
Exemple #53
0
    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()
Exemple #54
0
    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})
Exemple #55
0
    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
Exemple #56
0
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
Exemple #57
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'
Exemple #58
0
    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)