Esempio n. 1
0
 class FilterForm(forms.Form):
     fromDate = forms.DateTimeField(required=False)
     toDate = forms.DateTimeField(required=False)
     aUserId = forms.MultipleChoiceField(
         widget=forms.CheckboxSelectMultiple,
         required=False,
         choices=[(user.id,' '.join([user.last_name,user.first_name]))
                  for user in TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
         ])
Esempio n. 2
0
 def getResponsibleMenu(request):
     headerValues = headers.initGlobals(request)
     widget_manager = TaskWidgetManager()
     draft_id = request.GET.get('draft_id', None)
     if draft_id:
         from PManager.services.task_drafts import get_draft_by_id
         draft = get_draft_by_id(draft_id, request.user)
         if draft:
             users = draft.users.exclude(id=draft.author_id)
         else:
             users = dict()
     else:
         users = widget_manager.getResponsibleList(request.user, headerValues['CURRENT_PROJECT'])
     c = RequestContext(request, {
         'users': users
         })
     t = loader.get_template('helpers/responsible_menu.html')
     return HttpResponse(t.render(c))
Esempio n. 3
0
def widget(request, headerValues, widgetParams={}, qArgs=[], arPageParams={}):
    date = datetime.datetime.now()
    arWeekdays = {
        'Sun': u'Вс',
        'Mon': u'Пн',
        'Tue': u'Вт',
        'Wed': u'Ср',
        'Thu': u'Чт',
        'Fri': u'Пт',
        'Sat': u'Сб'
    }

    arDates = {}
    arDays = [{
                  'dateFormatted': date.date,
                  'date': date.strftime('%d.%m.%Y'),
                  'weekday': arWeekdays[date.strftime('%a')] + date.strftime(' %d.%m'),
                  'weekdayMark': date.strftime('%a')
              }]

    for i in range(1, 7):
        arDates[i] = date + datetime.timedelta(days=i)
        arDays.append({
            'dateObject': arDates[i],
            'dateFormatted': arDates[i].date,
            'date': arDates[i].strftime('%d.%m.%Y'),
            'weekday': arWeekdays[arDates[i].strftime('%a')] + arDates[i].strftime(' %d.%m'),
            'weekdayMark': arDates[i].strftime('%a')
        })
    arProject = []

    now = timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())

    projects = request.user.get_profile().getProjects()

    for project in projects:
        setattr(project, 'milestoneSet', project.milestones.all())
        setattr(project, 'isManaged', request.user.get_profile().isManager(project))

        for milestone in project.milestoneSet:
            if milestone.date < now and not milestone.closed:
                milestone.date = datetime.datetime.now()
                milestone.save()
            setattr(milestone, 'respSet', milestone.responsible.all())
            setattr(milestone, 'critically', random.randrange(1, 4))

        arProject.append(project)

    return {
        'title': u'Календарь ответственности',
        'projects': arProject,
        'arDays': arDays,
        'users': TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
    }
Esempio n. 4
0
    def getMyTeam(request):
        widgetManager = TaskWidgetManager()
        resps = widgetManager.getResponsibleList(request.user, None)
        if request.POST.get('q'):
            q = request.POST.get('q')
            resps = resps.filter(Q(Q(first_name__icontains=q) | Q(last_name__icontains=q)))

        aResps = []
        for resp in resps:
            p = resp.get_profile()
            respDict = {
                'first_name': resp.first_name,
                'last_name': resp.last_name,
                'rel': p.avatar_rel,
                'id': resp.id
            }
            histasksQty = resp.todo.filter(active=True, closed=False).count()
            respDict['openTasksQty'] = histasksQty
            aResps.append(respDict)

        return HttpResponse(json.dumps(aResps))
Esempio n. 5
0
def widget(request, headerValues, a, b):
    bAllUsers = request.GET.get('show_all') == 'Y'
    projects = PM_Project.objects.filter(tracker=TRACKER, closed=False, locked=False)
    now = timezone.make_aware(datetime.datetime.now(), timezone.get_current_timezone())

    users = TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
    if not bAllUsers:
        users = users.filter(id__in=PM_Timer.objects.filter(
            Q(Q(dateEnd=None) | Q(dateEnd__gt=datetime.datetime.now() - datetime.timedelta(days=1)))
        ).values('user__id'))

    users = users.order_by('last_name')

    # arFilter = {}

    usersResult = []
    maxTaskEffective = 0
    maxEventsQty = 1
    ratingUsers = deque()
    for user in users:
        userJoinTime = now - datetime.timedelta(days=30)
        # userJoinTime = userJoinTime.days if userJoinTime.days > 0 else 1
        # userJoinTime = 30
        taskClosedQty = PM_Task.objects.filter(closed=True, resp=user, dateClose__gte=userJoinTime, active=True).count()
        userRoles = user.userRoles.filter(project__in=projects)
        setattr(user, 'roles_in_projects', userRoles)

        profile = user.get_profile()

        if profile.avatar:
            profile.avatar = str(profile.avatar).replace('PManager', '')

        eventsQty = PM_Task_Message.objects.filter(
            dateCreate__gte=userJoinTime,
            author=user
        ).count()
        time = LogData.objects.raw(
            'SELECT SUM(`value`) as summ, id, user_id from PManager_logdata WHERE `user_id`=' + str(int(user.id)) + '' +
            ' AND datetime > \'' + userJoinTime.strftime('%Y-%m-%d %H:%M:%S') + '\'' +
            ' AND code = \'DAILY_TIME\''
        )
        allTime = 0
        for timer in time:
            allTime += timer.summ if timer.summ else 0

        setattr(user, 'profile', profile)
        setattr(user, 'tasksQty', taskClosedQty)
        setattr(user, 'eventsQty', eventsQty + round(allTime / 3600))

        if user.eventsQty > maxEventsQty:
            maxEventsQty = user.eventsQty

        if taskClosedQty:
            setattr(user, 'tasksEffective', round(taskClosedQty / 30, 4))

            if user.tasksEffective > maxTaskEffective:
                maxTaskEffective = user.tasksEffective
                ratingUsers.append(user.id)

        try:
            if user.pk:
                startedTimer = PM_Timer.objects.filter(user__id=user.pk).order_by('-dateEnd')
                if startedTimer:
                    startedTimer = startedTimer[0]
                    bHaveAccessToStartedTask = request.user.get_profile().hasAccess(startedTimer.task, 'view')
                    if bHaveAccessToStartedTask:
                        setattr(user, 'startedTask', startedTimer.task)
                        setattr(user, 'startedTimer', startedTimer)
                        setattr(user, 'taskTime', startedTimer.task.getAllTime())
                    else:
                        continue

        except PM_Timer.DoesNotExist:
            pass

        if not user.email and user.username.find('@'):
            setattr(user, 'email', user.username)

        usersResult.append(user)

    for user in usersResult:
        setattr(user, 'activity', int(round(float(user.eventsQty) / float(maxEventsQty), 2) * 100))

    projects = request.user.get_profile().getProjects()
    aProjects = []
    arWeekDays = {
        1: u'Пн',
        2: u'Вт',
        3: u'Ср',
        4: u'Чт',
        5: u'Пт',
        6: u'Сб',
        7: u'Вс',
    }

    for project in projects:
        weekdays = range(1, 7)
        now = datetime.datetime.combine(datetime.date.today(), datetime.time.max)
        now = timezone.make_aware(now, timezone.get_current_timezone())
        date1, date2 = None, None
        events = []
        for dayLost in weekdays:
            if not date2:
                date2 = now

            date1 = now - datetime.timedelta(days=dayLost)
            eventsQty = PM_Task_Message.objects.filter(
                dateCreate__lt=date2,
                dateCreate__gte=date1,
                project=project
            ).count()
            time = LogData.objects.raw(
                'SELECT SUM(`value`) as summ, id, user_id from PManager_logdata WHERE `project_id`=' + str(
                    int(project.id)) + '' +
                ' AND DATE(datetime) = \'' + date2.date().isoformat() + '\'' +
                ' AND code = \'DAILY_TIME\''
            )

            allTime = 0
            for timer in time:
                allTime += timer.summ if timer.summ else 0

            eventsQty += int(round(float(allTime) / float(3600)))
            events.append({
                'date': arWeekDays[date2.isoweekday()],
                'qty': eventsQty
            })
            date2 = date1

        events.reverse()
        setattr(project, 'events', events)
        aProjects.append(project)

    return {
        'title': u'Активность пользователей',
        'users': usersResult,
        'currentProject': int(request.GET.get('project', 0)),
        'projects': aProjects,
        'topUser': ratingUsers.pop() if len(ratingUsers) > 0 and bAllUsers else 0
    }
Esempio n. 6
0
def widget(request, headerValues, ar, qargs):
    """ Edit task POST Method """
    widgetManager = TaskWidgetManager()
    post = request.POST
    deadline = post.get('deadline', time.strftime('%d.%m.%Y'))

    deadline = templateTools.dateTime.convertToDateTime(deadline)
    name = post.get('name', False)
    status = post.get('status', False)
    if status:
        status = PM_Task_Status.objects.get(code=status)

    if request.GET.get('id', False):
        task = PM_Task.objects.get(id=int(request.GET.get('id', False)))
    else:
        task = False

    userTagSums = {}

    if name:
        planTime = post.get('planTime', 0)
        if planTime:
            planTime = planTime.replace(',', '.')
            if task and task.milestone:
                oldPlanTime = task.planTime or 0
                change = PM_MilestoneChanges(milestone=task.milestone,
                                             value=float(planTime) -
                                             oldPlanTime)
                change.save()

        arSaveFields = {
            'name':
            name,
            'text':
            post.get('description', ''),
            'repeatEvery':
            post.get('repeatEvery', 0),
            'deadline':
            deadline,
            'critically':
            float(post.get('critically', 0))
            if post.get('critically', 0) else 0.5,
            'hardness':
            float(post.get('hardness', 0)) if post.get('hardness', 0) else 0.5,
            'project_knowledge':
            float(post.get('project_knowledge', 0)) if post.get(
                'project_knowledge', 0) else 0.5,
            'reconcilement':
            float(post.get('reconcilement', 0)) if post.get(
                'reconcilement', 0) else 0.5,
            'planTime':
            float(planTime),
            'status':
            status if status else task.status
        }
        if task:
            for k, val in arSaveFields.iteritems():
                setattr(task, k, val)
        else:
            arSaveFields['author'] = request.user
            task = PM_Task(**arSaveFields)

        respId = post.get('resp', '')

        if str(respId).find('@') > -1:
            oUserProfile = PM_User.getOrCreateByEmail(respId, task.project,
                                                      'employee')
            respId = oUserProfile.id
        if respId:
            task.resp = User.objects.get(pk=int(respId))
            arSaveFields['resp'] = task.resp

        task.save()
        aObservers = post.getlist('observers')
        for (counter, observer) in enumerate(aObservers):
            if observer.find('@') > -1:
                oUserProfile = PM_User.getOrCreateByEmail(
                    observer, task.project, 'employee')
                aObservers[counter] = oUserProfile.id

        task.observers.clear()
        task.observers.add(*aObservers)
        task.saveTaskTags()

        if 'tags' not in arSaveFields:
            arSaveFields['tags'] = task.tags.all()

        arEmail = task.getUsersEmail([request.user.id])
        task.sendTaskEmail('task_changed', arEmail, 'Task has been changed.')

        backurl = request.GET.get('backurl', None)
        if backurl:
            return {'redirect': backurl}

    elif request.GET.get('id', False):
        from PManager.services.similar_tasks import tags_relations, similar_tasks
        arSaveFields = task
        if arSaveFields:
            tagsRelations = tags_relations(arSaveFields)
            aSimilarTasks = similar_tasks(arSaveFields.id,
                                          tagsRelations=tagsRelations)
            resp = arSaveFields.resp
            tags = arSaveFields.tags.all()
            observers = arSaveFields.observers.all()
            aUsersHaveAccess = widgetManager.getResponsibleList(
                request.user, None).values_list('id', flat=True)
            currentRecommendedUser, userTagSums = get_user_tag_sums(
                get_task_tag_rel_array(task), None, aUsersHaveAccess)
            arSaveFields = arSaveFields.__dict__
            arSaveFields.update({
                'tags':
                tags,
                'resp':
                resp,
                'observers':
                observers,
                'critically':
                arSaveFields.get('critically', 0.5),
                'hardness':
                arSaveFields.get('hardness', 0.5),
                'project_knowledge':
                arSaveFields.get('project_knowledge', 0.5),
                'reconcilement':
                arSaveFields.get('reconcilement', 0.5),
                'similarTasks':
                aSimilarTasks,
                'tagsRelations':
                tagsRelations,
                'files':
                task.files.all(),
                'status':
                status if status else task.status
            })

    else:
        arSaveFields = {}

    users = widgetManager.getResponsibleList(request.user,
                                             headerValues['CURRENT_PROJECT'])

    for field, val in arSaveFields.iteritems():
        if isinstance(val, datetime.datetime):
            arSaveFields[field] = val.strftime('%d.%m.%Y %H:%M')

    return {
        'id':
        request.GET.get('id', False),
        'post':
        arSaveFields,
        'project':
        task.project
        if task and task.project else headerValues['CURRENT_PROJECT'],
        'users':
        users,
        'recommendedUsers': [i for i, c in userTagSums.iteritems()],
        'title':
        u'Изменение задачи',
        'files':
        taskExtensions.getFileList(task.files.all())
    }
Esempio n. 7
0
def widget(request, headerValues,a,b):
    class FilterForm(forms.Form):
        fromDate = forms.DateTimeField(required=False)
        toDate = forms.DateTimeField(required=False)
        aUserId = forms.MultipleChoiceField(
            widget=forms.CheckboxSelectMultiple,
            required=False,
            choices=[(user.id,' '.join([user.last_name,user.first_name]))
                     for user in TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
            ])

    filterForm = FilterForm(
        data=request.GET
    )
    cur_user_access_projects = [v['id'] for v in request.user.get_profile().getProjects().values('id')]
    weeksDelta = 4

    dateStart = datetime.datetime.now() - datetime.timedelta(weeks=weeksDelta)
    dateEnd = None
    users_id = filterForm['aUserId'].value()
    if filterForm.is_valid() and users_id:
        users_id_tmp = []
        for uId in users_id:
            users_id_tmp.append(int(uId))
        users_id = users_id_tmp
        del users_id_tmp

        dateStart = templateTools.dateTime.convertToDateTime(filterForm['fromDate'].value()) if filterForm['fromDate'].value() else None
        dateEnd = templateTools.dateTime.convertToDateTime(filterForm['toDate'].value()) if filterForm['toDate'].value() else None
        if dateEnd:
            dateEnd += datetime.timedelta(days=1) #include all day of end of range

        if dateStart and not dateEnd:
            dateEnd = datetime.datetime.now()
    else:
        users_id = []

    allUsers = TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
    users = allUsers.filter(pk__in=users_id)

    filterProject = int(request.GET.get('project', 0))
    if filterProject:
        cur_user_access_projects = [filterProject]

    for user in users:
        profile = user.get_profile()
        if profile.avatar:
            profile.avatar = str(profile.avatar).replace('PManager', '')
        setattr(user,'profile',profile)

        if not user.email and user.username.find('@'):
            setattr(user, 'email', user.username)

        # query = 'SELECT SUM(`seconds`) as summ, id, user_id, task_id, dateStart, dateEnd from PManager_pm_timer' + \
        #         ' WHERE `user_id`=' + str(int(user.id)) + \
        #         ' AND `dateStart` > \'' + str(dateStart) + '\'' + \
        #         ((' AND `dateStart` < \'' + str(dateEnd) + '\'') if dateEnd else '') + \
        #         ' GROUP BY `task_id` ORDER BY `dateStart` DESC'
        # timers = PM_Timer.objects.raw(query)
        timers = PM_Timer.objects.filter(dateEnd__gt=dateStart, user=user)
        if dateEnd:
            timers = timers.filter(dateEnd__lt=dateEnd)

        arTaskTime = []
        allUserTime = 0
        allCommentsQty = 0
        allFilesQty = 0
        for timer in timers:
            try:
                task = timer.task
                if task.project.id not in cur_user_access_projects:
                    continue

                comments = PM_Task_Message.objects.filter(task=task, author=user)

                if dateEnd:
                    comments = comments.filter(dateCreate__lt=dateEnd)

                if dateStart:
                    comments = comments.filter(dateCreate__gt=dateStart)

                if timer.seconds:
                    allUserTime += int(timer.seconds)

                allCommentsQty += comments.count()
                arTaskTime.append({
                    'comments_qty': comments.count(),
                    'task': task,
                    'timer': timer,
                    'date': timer.dateEnd
                })

            except PM_Task.DoesNotExist:
                pass

        setattr(user, 'taskTime', arTaskTime)
        setattr(user, 'allTime', PM_Timer(seconds=allUserTime) if allUserTime else None)
        setattr(user, 'all_comments_qty', allCommentsQty)
        setattr(user, 'all_files_qty', allFilesQty)

        closedTaskQty = PM_Task.objects.filter(resp=user, active=True)
        commentsQty = PM_Task_Message.objects.filter(author=user)
        if dateEnd:
            closedTaskQty = closedTaskQty.filter(dateClose__lt=dateEnd)
            commentsQty = commentsQty.filter(dateCreate__lt=dateEnd)

        if dateStart:
            closedTaskQty = closedTaskQty.filter(dateClose__gt=dateStart)
            commentsQty = commentsQty.filter(dateCreate__gt=dateStart)

        closedTaskQty = closedTaskQty.count()
        commentsQty = commentsQty.count()

        setattr(user, 'closedTaskQty', closedTaskQty)
        setattr(user, 'commentsQty', commentsQty)

    return {
        'users': users,
        'allUsers': allUsers,
        'filterForm': filterForm,
        'now': templateTools.dateTime.convertToSite(timezone.make_aware(datetime.datetime.now(), timezone.get_current_timezone())),
        'week_ago': templateTools.dateTime.convertToSite(timezone.make_aware(datetime.datetime.now(), timezone.get_current_timezone()) - datetime.timedelta(days=7)),
        'title': u'Статистика пользователей'
    }
Esempio n. 8
0
def widget(request,
           headerValues,
           widgetParams={},
           qArgs=[],
           arPageParams={},
           addFields=[]):

    widgetManager = TaskWidgetManager()
    filter = {}
    """ # TODO REDUNDANT filter=False ever
    if filter:
        lManager = listManager(PM_Task)
        filter = lManager.parseFilter(filter)
    """

    needTaskList = False
    if 'filter' in widgetParams:
        filter.update(widgetParams['filter'])
        needTaskList = True

    pst = lambda n: request.POST.get(n, 0) if hasattr(request, 'POST'
                                                      ) else None
    pSettings = {}
    if 'CURRENT_PROJECT' in headerValues and \
            headerValues['CURRENT_PROJECT'] and \
            not 'allProjects' in filter:
        project = widgetManager.getProject(headerValues['CURRENT_PROJECT'])
        pSettings = project.getSettings()
        if project.locked:
            return {'redirect': 'payment'}

        filter['project'] = project
    else:
        if 'allProjects' in filter:
            del filter['allProjects']
        project = None
    """ # TODO: CHECK if milestone defined
    if pst('add-to-milestone'):
        tasksId = request.POST.getlist('task')
        mId = int(pst('milestone')) if pst('milestone') else 0
        mName = pst('milestone_name')
        mDate = pst('milestone_date')
        mDesc = pst('milestone_description')
        milestone = None
        if mId:
            milestone = PM_Milestone.objects.get(pk=mId)
        elif project:
            if mName:
                mName = mName.strip()
                if mDate:
                    try:
                        mDate = templateTools.dateTime.convertToDateTime(mDate)
                    except (Exception):
                        mDate = None

                if not mDate:
                    mDate = datetime.datetime.now()

                milestone = PM_Milestone(name=mName, project=project, description=mDesc)
                milestone.date = mDate
                milestone.save()

        for tId in tasksId:
            if int(tId):
                task = PM_Task.objects.get(pk=int(tId))

                if task.milestone:
                    change = PM_MilestoneChanges(milestone=task.milestone, value=-(task.planTime or 0))
                    change.save()

                task.milestone = milestone
                task.save()

                if milestone:
                    change = PM_MilestoneChanges(milestone=milestone, value=(task.planTime or 0))
                    change.save()

        return {'redirect': ''}

    elif pst('add-to-release'):
    
        tasksId = request.POST.getlist('task')
        mId = int(pst('release')) if pst('release') else 0
        mName = pst('release_name')
        mDate = pst('release_date')
        milestone = None
        if mId:
            milestone = Release.objects.get(pk=mId)
        elif project:
            if mName:
                mName = mName.strip()
                if mDate:
                    try:
                        mDate = templateTools.dateTime.convertToDateTime(mDate)
                    except (Exception):
                        mDate = None

                if not mDate:
                    mDate = datetime.datetime.now()

                milestone = Release(name=mName, project=project)
                milestone.date = mDate
                milestone.save()

        for tId in tasksId:
            if int(tId):
                task = PM_Task.objects.get(pk=int(tId))
                task.release = milestone
                task.save()

        return {'redirect': ''}
    
    #elif pst('add-observers'):
    """
    if pst('add-observers'):
        #todo: объединить с выше
        tasksId = request.POST.getlist('task')
        mId = int(pst('observer')) if pst('observer') else 0
        if mId:
            observer = User.objects.get(pk=mId)
        else:
            observer = None
        if observer:
            for tId in tasksId:
                if int(tId):
                    task = PM_Task.objects.get(pk=int(tId))
                    task.observers.add(observer)
                    task.save()

        return {'redirect': ''}

    if isinstance(request, User):
        #@var User request
        cur_user = request
    else:
        #@var HttpRequest request
        cur_user = request.user

    cur_prof = None
    aManagedProjectsId = dict()
    if cur_user.is_authenticated():
        cur_prof = cur_user.get_profile()
        try:
            aManagedProjectsId = cur_prof.managedProjects.values_list(
                'id', flat=True)
        except AttributeError:
            aManagedProjectsId = dict()

    if not 'pageCount' in arPageParams:
        arPageParams['pageCount'] = 20

    arPageParams['page'] = int(request.POST.get('page')) if request.POST.get(
        'page', None) else 1

    tasks, paginator = {}, {}
    now = timezone.make_aware(datetime.datetime.now(),
                              timezone.get_default_timezone())

    if needTaskList:

        addTasks = {}

        if not 'parentTask' in filter and \
                not 'pk' in filter and \
                not 'isParent' in filter and \
                not 'all' in filter:
            filter['parentTask_id__isnull'] = True
        else:
            if 'pageCount' in arPageParams:
                del arPageParams[
                    'pageCount']  #выводим все подзадачи, а не только кусок, как для задач

        if 'exclude' in widgetParams:
            filter['exclude'] = widgetParams['exclude']

        arTaskOrderParams = {'group': arPageParams.get('group', None)}
        if arTaskOrderParams['group'] == 'milestones':
            filter['closed'] = False
        tasks = PM_Task.getForUser(cur_user, project, filter, qArgs,
                                   arTaskOrderParams)
        try:
            tasks = tasks['tasks']
            tasks = tasks.select_related('resp', 'project', 'milestone',
                                         'parentTask__id', 'author', 'status',
                                         'tag', 'tags__tag')
            qty = tasks.count()

        except AttributeError:
            qty = 0
            tasks = []
        if 'page' not in arPageParams:
            arPageParams['page'] = 1

        paginator = {}
        if 'pageCount' in arPageParams:
            tasks = tasks[(arPageParams['page'] - 1) *
                          arPageParams['pageCount']:arPageParams['page'] *
                          arPageParams['pageCount']]

            paginator = {
                'all_qty':
                qty,
                'lastPage':
                (qty <= arPageParams['page'] * arPageParams['pageCount'])
            }

        currentRecommendedUser = None
        arBIsManager = {}

        arBets = {}
        arClientBets = {}
        # aUsersHaveAccess = []
        # if cur_user.is_authenticated():
        #     widgetManager.getResponsibleList(cur_user, None).values_list('id', flat=True)

        for task in tasks:
            if not task.id in arBIsManager:
                arBIsManager[task.id] = task.project.id in aManagedProjectsId

            # currentRecommendedUser, userTagSums = get_user_tag_sums(get_task_tag_rel_array(task), currentRecommendedUser,
            #                                                         aUsersHaveAccess)

            last_message_q = task.messages
            if not arBIsManager[task.id]:
                last_message_q = last_message_q.filter(
                    hidden=False,
                    hidden_from_clients=False,
                    hidden_from_employee=False,
                    isSystemLog=False)
            last_message_q = last_message_q.order_by("-pk")

            # Yegor comment PM_Timer Deprecated
            # try:
            #     startedTimer = PM_Timer.objects.get(task=task, dateEnd__isnull=True)
            # except PM_Timer.DoesNotExist:
            #     startedTimer = None

            if 'parentTask' not in filter:
                # subtasksQuery = PM_Task.objects.filter(parentTask=task, active=True)
                filterQArgs = PM_Task.getQArgsFilterForUser(
                    cur_user, task.project)
                filterQArgs = PM_Task.mergeFilterObjAndArray(
                    {
                        'parentTask': task,
                        'active': True
                    }, filterQArgs)
                subtasksQuery = PM_Task.objects.filter(*filterQArgs).distinct()
                subtasksQty = subtasksQuery.count()

                subtasksActiveQuery = subtasksQuery.filter(
                    closed=False).distinct()
                subtasksActiveQty = subtasksActiveQuery.count()
            else:
                subtasksQty = 0
                subtasksActiveQty = 0

            responsibleSequence = None
            if subtasksQty:
                subtaskPlanTime = 0
                for t in subtasksQuery.annotate(summ=Sum('planTime')):
                    subtaskPlanTime += t.summ if t.summ else 0

                if subtasksActiveQty:
                    responsibleSequence = []
                    idSequence = []
                    for stask in subtasksActiveQuery.filter(
                            resp__isnull=False):
                        if stask.resp:
                            respName = stask.resp.first_name + ' ' + stask.resp.last_name \
                                if stask.resp.first_name else stask.resp.username
                            if not stask.resp.id in idSequence:
                                idSequence.append(stask.resp.id)
                                responsibleSequence.append({
                                    'id': stask.resp.id,
                                    'name': respName
                                })

            bCanBaneUser = False
            if arBIsManager[task.id] and task.resp:
                bCanBaneUser = True

            last_mes = last_message_q[0] if last_message_q else None

            users_messages = []
            messages = task.messages.filter(author__id__isnull=False)
            for message in messages:
                d = {
                    'id': message.author.id,
                    'name': message.author.get_full_name(),
                    'avatar': message.author.profile.avatarSrc,
                }
                if not d in users_messages:
                    users_messages.append(d)

            winner = task.getWinner()
            winner_dict = {}
            if winner:
                winner_dict = {
                    'id': winner.id,
                    'avatar': winner.profile.avatarSrc
                }

            addTasks[task.id] = {
                'url':
                task.url,
                'project': {
                    'name': task.project.name,
                    'id': task.project.id,
                },
                'author': {
                    'first_name': task.author.first_name,
                    'last_name': task.author.last_name
                },
                'donated':
                task.donated,
                'asked':
                task.asked,
                'canEdit':
                task.canEdit(cur_user)
                if cur_user.is_authenticated() else False,
                'canRemove':
                task.canPMUserRemove(cur_prof) if cur_prof else False,
                'canSetOnPlanning':
                arBIsManager[task.id] or cur_user.id == task.author.id,
                'canObserve':
                cur_user.is_authenticated(),
                'canApprove':
                arBIsManager[task.id] or cur_user.id == task.author.id,
                #todo: разрешать платным пользователям только если денег хватает
                'canClose':
                (cur_user.is_superuser or cur_user.id == task.author.id)
                if cur_user else False,
                'canSetReady':
                cur_prof.hasRole(task.project) and task.messages.filter(
                    author=cur_user).exists() if cur_prof else False,
                'canSetCritically':
                arBIsManager[task.id] or cur_user.id == task.author.id
                if cur_user.is_authenticated() else False,
                'canSetPlanTime':
                task.canPMUserSetPlanTime(cur_prof) if cur_prof else False,
                'canBaneUser':
                bCanBaneUser,
                # PM_TIMER deprecated
                #'startedTimerExist': startedTimer != None,
                #'startedTimerUserId': startedTimer.user.id if startedTimer else None,
                'status':
                task.status.code if task.status else '',
                'todo': [{
                    'todo': t['todo'],
                    'bug': t['bug'],
                    'checked': t['checked']
                } for t in task.messages.filter(Q(Q(todo=True) | Q(
                    bug=True))).order_by('id').values('checked', 'bug', 'todo')
                         ],
                'resp':
                responsibleSequence if responsibleSequence else [{
                    'id':
                    task.resp.id,
                    'name':
                    task.resp.first_name + ' ' + task.resp.last_name
                    if task.resp.first_name else task.resp.username
                } if task.resp else {}],
                'last_message': {
                    'text':
                    TextFilters.escapeText(last_mes.text),
                    'date':
                    last_mes.dateCreate,
                    #todo: исправить говнокод на метод сообщения getLastTextObject
                    'author':
                    last_mes.author.first_name + ' ' +
                    last_mes.author.last_name if last_mes.author else '',
                } if last_mes and last_mes.author else {
                    'text': task.text
                },
                # 'responsibleList': userTagSums,
                'files':
                taskExtensions.getFileList(task.files.all()),
                'planTimes': [],
                'viewed': (task.closed or task.isViewed(cur_user))
                if cur_user.is_authenticated() else False,
                'parent':
                task.parentTask.id if task.parentTask
                and hasattr(task.parentTask, 'id') else None,
                'parentName':
                task.parentTask.name if task.parentTask
                and hasattr(task.parentTask, 'name') else '',
                'subtasksQty':
                subtasksQty,
                'resultsQty':
                task.messages.filter(code='RESULT').count(),
                'subtasksActiveQty':
                subtasksActiveQty,
                'observer':
                True if task.observers.filter(id=cur_user.id) else False,
                'avatar':
                task.resp.get_profile().avatar_rel if task.resp else {},
                'milestoneId':
                task.milestone.id if task.milestone else None,
                'users':
                users_messages,
                'winner':
                winner_dict,
                'createdAt':
                templateTools.dateTime.convertToSite(task.dateCreate,
                                                     '%d.%m.%Y %H:%M'),
                'group': {
                    'name':
                    task.milestone.name,
                    'id':
                    task.milestone.id,
                    'description':
                    task.milestone.description,
                    'code':
                    'milestone',
                    'closed':
                    task.milestone.closed,
                    'date':
                    templateTools.dateTime.convertToSite(
                        task.milestone.date, '%d.%m.%Y')
                }
                if task.milestone and arPageParams.get('group') == 'milestones'
                else {}  #overrides by projects
            }

            if not project:
                addTasks[task.id]['group'] = {
                    'name': task.project.name,
                    'id': task.project.id,
                    'code': 'project',
                    'url': task.project.taskListUrl
                }

            if subtasksQty:
                addTasks[task.id]['planTime'] = subtaskPlanTime

            addTasks[task.id]['needRespRecommendation'] = (
                len(addTasks[task.id]['resp']) <= 0
                or not addTasks[task.id]['resp'][0])

            task_tags = task.tags.filter(tag__is_public=True)
            list_tags = []
            if task_tags.exists():

                for tag in task_tags.values('tag__id', 'tag__tagText',
                                            'tag__color'):
                    list_tags.append({
                        'tagText': tag['tag__tagText'],
                        'id': tag['tag__id'],
                        'color': tag["tag__color"]
                    })
            addTasks[task.id]['tags'] = list_tags

            if cur_user.is_authenticated():
                reminder = PM_Reminder.objects.filter(
                    task=task,
                    user=cur_user).order_by('-date').values_list('date',
                                                                 flat=True)
                if reminder.exists():
                    addTasks[task.id]['reminder'] = reminder[0]

            # if addTasks[task.id]['needRespRecommendation']:
            #     if currentRecommendedUser:
            #         recommendedUser = User.objects.get(pk=int(currentRecommendedUser))
            #         recommendedUserArray = {
            #             'id': recommendedUser.id,
            #             'name': recommendedUser.first_name + ' ' + recommendedUser.last_name
            #         }
            #         addTasks[task.id]['recommendedUser'] = {
            #             'id': int(currentRecommendedUser),
            #             'name': recommendedUserArray['name']
            #         }
            # TODO: DISABLE PLANTIME ?
            # planTimes = PM_User_PlanTime.objects.filter(task=task).distinct()
            # for obj in planTimes:
            #     addTasks[task.id]['planTimes'].append({
            #         'user_url': obj.user.get_profile().url,
            #         'user_id': obj.user.id,
            #         'user_name': obj.user.first_name + ' ' + obj.user.last_name,
            #         'time': obj.time
            #     })

            #     if not task.planTime and obj.user.id == cur_user.id:
            #         addTasks[task.id]['planTime'] = obj.time

    aUserLinks = dict()
    resps = widgetManager.getResponsibleList(cur_user, project)
    aResps = []
    for resp in resps:
        histasksQty = resp.todo.filter(active=True, closed=False).count()
        setattr(resp, 'openTasksQty', histasksQty)
        if resp.id not in aUserLinks:
            try:
                aUserLinks[resp.id] = {
                    'url': resp.get_profile().url,
                    'name': resp.last_name + ' ' + resp.first_name,
                }
                aResps.append(resp)
            except PM_User.DoesNotExist:
                pass

    if needTaskList:
        aTasksId = addTasks.keys()
        if aTasksId:
            #todo: all queries
            aTimers = PM_Task.getAllTimeOfTasksWithSubtasks(aTasksId)
            tasks = tasks_to_tuple(tasks, addFields)
            tasks = task_list_prepare(tasks, addTasks, False)

            for task in tasks:
                task['time'] = 0
                task['timers'] = []
                if task['id'] in aTimers:
                    task['time'] = sum(aTimers[task['id']].values())
                    for uid in aTimers[task['id']]:
                        if uid in aUserLinks.keys():
                            task['timers'].append({
                                'time':
                                templateTools.dateTime.timeFromTimestamp(
                                    aTimers[task['id']][uid]),
                                'user':
                                aUserLinks[uid]['name'],
                                'user_url':
                                aUserLinks[uid]['url']
                            })
                task['full'] = True

    today = timezone.make_aware(datetime.datetime.today(),
                                timezone.get_current_timezone())
    yesterday = timezone.make_aware(
        datetime.datetime.today() - datetime.timedelta(days=1),
        timezone.get_current_timezone())
    template = templateTools.get_task_template()

    title = u'All challenges' if not project else project.name + ' / Challenges'
    header = u'Active challenges' if not project else '<a href="/project/' + str(
        project.id) + '/public/">' + project.name + '</a>' + ' / Challenges'

    result = {
        'title':
        title,
        'header':
        header,
        'tasks':
        tasks,
        'project':
        project,
        'users':
        aResps,
        'bounty':
        widgetParams.get('bounty'),
        'projectSettings':
        pSettings,
        'tab':
        True,
        'name':
        u'Tasks',
        'paginator':
        paginator,
        # TODO: milestones disabled
        #'milestones': PM_Milestone.objects.filter(project=project, closed=False),
        # TODO: releases disabled
        #'releases': Release.objects.filter(project=project, status='new'),
        'nextPage':
        arPageParams.get('startPage', 0) +
        1 if 'startPage' in arPageParams else None,
        'filterDates': {
            'today':
            templateTools.dateTime.convertToSite(today, '%d.%m.%Y'),
            'yesterday':
            templateTools.dateTime.convertToSite(yesterday, '%d.%m.%Y'),
        },
        'canInvite':
        cur_prof.isManager(project) if project and cur_prof else False,
        'template':
        template,
        'tags':
        list(Tags.objects.filter(is_public=True).values('id', 'tagText')),
    }

    if cur_user.is_authenticated():
        result['qty'] = {
            'ready':
            PM_Task.getQtyForUser(cur_user, project, {
                'status__code': 'ready',
                'closed': False,
                'active': True
            }),
            'started':
            PM_Task.getQtyForUser(cur_user, project, {
                'realDateStart__isnull': False,
                'closed': False,
                'active': True
            }),
            'not_approved':
            PM_Task.getQtyForUser(cur_user, project, {
                'status__code': 'not_approved',
                'closed': False,
                'active': True
            }),
            'deadline':
            PM_Task.getQtyForUser(
                cur_user, project, {
                    'deadline__lt': now,
                    'deadline__isnull': False,
                    'closed': False,
                    'active': True
                })
        }
    return result
Esempio n. 9
0
def widget(request, headerValues, arFilter, q):
    widgetManager = TaskWidgetManager()
    cur_user = request.user


    prof = None
    if cur_user.is_authenticated():
        prof = request.user.get_profile()

    task = None
    if 'id' in request.GET or 'number' in request.GET:
        try:
            if 'id' in request.GET:
                task = PM_Task.objects.filter(id=int(request.GET.get('id')), active=True).get()
            elif 'number' in request.GET and 'project' in request.GET:
                task = PM_Task.objects.filter(
                    number=int(request.GET.get('number')),
                    project=int(request.GET.get('project')),
                    parentTask__isnull=True,
                    active=True
                )[0]
        except (PM_Task.DoesNotExist, ValueError, IndexError):
            task = None

        if not task:
            raise Http404(u'Задача удалена')

        if not task.onPlanning and not cur_user.get_profile().hasAccess(task, 'view'):
            raise Http404(u'Нет прав для просмотра задачи')

        error = ''
        cid = int(request.GET.get('confirm', 0))
        if cid:
            try:
                message = PM_Task_Message.objects.get(pk=cid, task=task)
                if message.code == 'SET_PLAN_TIME':
                    planTime = PM_User_PlanTime.objects.get(task=task, user=message.author)

                    authorProf = message.author.get_profile()

                    if not authorProf.hasRole(task.project, not_guest=True):
                        authorProf.setRole('employee', task.project)
                        if authorProf.is_outsource:
                            Agreement.objects.get_or_create(
                                payer=task.project.payer,
                                resp=authorProf.user
                            )

                    if not authorProf.isEmployee(task.project):
                        task.resp = prof.user
                    else:
                        task.resp = planTime.user

                    task.planTime = planTime.time
                    task.onPlanning = False
                    task.setStatus('revision')
                    task.save()
                    redisSendTaskUpdate({
                        'status': task.status.code,
                        'onPlanning': task.onPlanning,
                        'planTime': task.planTime,
                        'resp': [{
                            'id': task.resp.id,
                            'name': task.resp.first_name + ' ' + task.resp.last_name
                        }],
                        'viewedOnly': request.user.id,
                    })


                    task.systemMessage(
                        u'подтвердил(а) оценку в ' + str(task.planTime) +
                        u'ч. пользователя ' + planTime.user.first_name +
                        u' ' + planTime.user.last_name,
                        cur_user,
                        'CONFIRM_ESTIMATION'
                    )

                    task.sendTaskEmail('new_task', [planTime.user.email])
                elif message.code == 'TIME_REQUEST':
                    if not message.requested_time_approved:
                        if prof and prof.user.id == message.project.payer.id or prof.isManager(message.project):
                            message.requested_time_approved = True
                            message.requested_time_approve_date = datetime.datetime.now()
                            message.requested_time_approved_by = request.user
                            message.save()

                return {'redirect': task.url}
            except PM_Task_Message.DoesNotExist:
                pass
            except PM_User_PlanTime.DoesNotExist:
                pass


        winner = task.getWinner()

        setattr(task, 'text_formatted', TextFilters.getFormattedText(task.text) if task.text else '')
        # setattr(task, 'responsibleList', task.responsible.all())
        setattr(task, 'observersList', task.observers.all())
        setattr(task, 'currentWinner', winner)
        setattr(task, 'taskPlanTime', task.planTime)

        if cur_user.is_authenticated():
            setattr(task, 'canSetOnPlanning', task.onPlanning or task.canEdit(cur_user))
            setattr(task, 'canSetPlanTime', task.canPMUserSetPlanTime(prof))
            setattr(task, 'canObserve', cur_user.is_authenticated())
            setattr(task, 'canSetCritically', task.canEdit(cur_user))
            setattr(task, 'canSetReady', prof.hasRole(task.project))
            setattr(task, 'canEdit', task.canEdit(cur_user))
            setattr(task, 'canRemove', task.canPMUserRemove(prof))
            setattr(task, 'canApprove', cur_user.id == task.author.id or prof.isManager(task.project) or cur_user.is_superuser)
            setattr(task, 'canClose', task.canApprove)
            setattr(task, 'canConfirm', cur_user.is_authenticated() and task.donations.filter(user=cur_user).count())


        setattr(task, 'taskResp', [{'id': task.resp.id, 'name': task.resp.first_name + ' ' + task.resp.last_name if task.resp.first_name else task.resp.username} if task.resp else {}])

        allTime = task.getAllTime()
        files = taskExtensions.getFileList(task.files.all())

        if task:
            #set task readed
            if cur_user.is_authenticated():
                if not cur_user.id in [u.id for u in task.viewedUsers.all()]:
                    task.viewedUsers.add(cur_user)

            hiddenSubTasksExist = False
            arFilter = {
                'parentTask': task
            }

            subtasks = []
            # subtasks = taskList(request, headerValues, {'filter': arFilter}, [], {})
            # subtasks = subtasks['tasks']
            # for subtask in subtasks:
            #     if subtask['closed']:
            #         hiddenSubTasksExist = True
            #         break

        # users = widgetManager.getResponsibleList(request.user, headerValues['CURRENT_PROJECT'])
        users = User.objects.order_by('last_name').filter(
            pk__in=PM_Task_Message.objects.filter(task=task).values('author__id')
        )

        candidates = User.objects.order_by('last_name').filter(
            pk__in=PM_Task_Message.objects.filter(task=task, code='RESULT').values('author__id')
        )

        dict = task.__dict__

        for field, val in dict.iteritems():
            if isinstance(val, datetime.datetime):
                setattr(task, field, val.strftime('%d.%m.%Y %H:%M'))


        messages = task.messages.order_by('-dateCreate').exclude(code="WARNING")

        if not cur_user.is_authenticated():
            messages = messages.filter(isSystemLog=True)
        else:
            # userRoles = PM_ProjectRoles.objects.filter(user=request.user, role__code='manager')
            if not request.user.is_superuser:
                messages = messages.exclude(code="RESULT")
                messages = messages.filter(Q(hidden=False) | Q(userTo=request.user.id) | Q(author=request.user.id))


            if not prof.isManager(task.project):
                if prof.isClient(task.project):
                    messages = messages.filter(hidden_from_clients=False)
                if prof.isEmployee(task.project):
                    messages = messages.filter(hidden_from_employee=False)

        lamp, iMesCount = 'no-asked', messages.count()

        if iMesCount > 0 and messages[iMesCount - 1]:
            if messages[iMesCount - 1].author and messages[iMesCount - 1].author.id == cur_user.id:
                lamp = 'asked'

        arTodo = []
        arBugs = []
        for mes in messages:
            if mes.todo:
                arTodo.append({
                    'id': mes.id,
                    'text': mes.text,
                    'checked': mes.checked
                })

            if mes.bug:
                arBugs.append({
                    'id':mes.id,
                    'text': mes.text,
                    'checked': mes.checked
                })

            ob = {
                'init': True
            }
            if cur_user.is_authenticated():
                ob['canEdit'] = mes.canEdit(cur_user)
                ob['canDelete'] = mes.canDelete(cur_user)

                if mes.userTo and mes.userTo.id == cur_user.id:
                    mes.read = True
                    mes.save()

                if cur_user.get_profile().isManager(task.project):
                    ob.update({
                        'hidden_from_clients': mes.hidden_from_clients,
                        'hidden_from_employee': mes.hidden_from_employee
                    })

            setattr(mes, 'json', json.dumps(mes.getJson(ob, cur_user if cur_user.is_authenticated() else None)))

        # try:
        #     startedTimer = PM_Timer.objects.get(task=task, dateEnd__isnull=True)
        # except PM_Timer.DoesNotExist:
        #     startedTimer = None

        startedTimer = None
        setattr(task, 'todo', arTodo)
        setattr(task, 'bug', arBugs)
        templates = templateTools.getMessageTemplates()
        taskTemplate = templateTools.get_task_template()
        backers = User.objects.filter(
            pk__in=PM_Project_Donation.objects.filter(task=task)
                .values_list('user__id', flat=True)
        )

        aBackers = []
        from tracker.settings import GIFT_USD_RATE
        arDonateSum = 0
        arDonateQty = 0
        for backer in backers:
            setattr(backer, 'donated', backer.get_profile().get_donation_sum(taskId=task.id) * GIFT_USD_RATE)
            arDonateSum += backer.donated
            arDonateQty += 1
            aBackers.append(backer)

        aBackers.sort(key=lambda x: -x.donated)

        askers = []
        maxRequested = 100
        askedMin = 0
        askedMax = 0
        for m in task.messages.filter(requested_time_approved=True):
            if maxRequested < m.requested_time:
                maxRequested = m.requested_time
            askers.append({
                'user': m.author,
                'ask': m.requested_time
            })

            if not askedMin or askedMin > m.requested_time:
                askedMin = m.requested_time

            if askedMax < m.requested_time:
                askedMax = m.requested_time

        askers.sort(key=lambda x: x['ask'])

        results = []
        if task.project.id != 1131 or request.user.is_superuser or (request.user.is_authenticated() and request.user.id == 2318):
            for m in task.messages.filter(code='RESULT'):
                if maxRequested < m.requested_time:
                    maxRequested = m.requested_time

                results.append(m)

        if maxRequested:
            maxRequested += maxRequested * 0.1

        for asker in askers:
            asker['percent'] = asker['ask'] * 100 / maxRequested

        team = []
        userShares = {}
        if task.project.blockchain_state:
            try:
                state = json.loads(task.project.blockchain_state)
                userShares = state['Users']
                teamWallets = userShares.keys()
            except ValueError:
                teamWallets = []

            t = PM_User.objects.filter(blockchain_wallet__in=teamWallets)
            for u in t:
                setattr(u, 'percent', userShares[u.blockchain_wallet])
                team.append(u)


        # brain = TaskMind()
        return {
            'projectTeam': team,
            'title': task.name,
            'task': task,
            'voted': PM_Task_Message.objects.filter(code='VOTE', author=request.user.id, task=task).exists(),
            'donated': PM_Task_Message.objects.filter(code='DONATION', author=request.user.id, task=task).exists(),
            'todo': task.messages.filter(todo=True),
            'asked_min': askedMin,
            'asked_max': askedMax,
            'donatedPercent': task.donated * 100 / maxRequested,
            'startedTimerExist': startedTimer != None,
            'startedTimerUserId': startedTimer.user.id if startedTimer else None,
            'project': task.project,
            'is_employee': cur_user.get_profile().isEmployee(task.project) if cur_user.is_authenticated() else False,
            'is_manager': cur_user.get_profile().isManager(task.project) if cur_user.is_authenticated() else False,
            'user_roles': cur_user.get_profile().getRoles(task.project) if cur_user.is_authenticated() else False,
            'files': files,
            'time': allTime,
            'avgDonate': (arDonateSum * 0.5 / (arDonateQty or 1)) if arDonateSum else 5,
            'backers': aBackers,
            'askers': askers,
            'results': results,
            'subtasks': subtasks,
            'taskTemplate': taskTemplate,
            'users': users,
            'candidates': candidates,
            'messages': messages,
            # 'solutions': similar_solutions(task.id),
            'lamp': lamp,
            'hiddenSubTasksExist': hiddenSubTasksExist,
            'templates': templates,
            'error': error
            # 'dataSet': len(arParams),
            # 'similarSet': len(tasksSimilar),
            # 'params': arParams
        }
Esempio n. 10
0
def widget(request, headerValues, a, b):
    users = TaskWidgetManager.getUsersThatUserHaveAccess(request.user, headerValues['CURRENT_PROJECT'])
    users = users.order_by('last_name')
    projects = PM_Project.objects.filter(tracker=TRACKER, closed=False, locked=False)
    now = timezone.make_aware(datetime.datetime.now(), timezone.get_current_timezone())
    arFilter = {}

    if 'auth' in request.GET:
        if request.user.is_superuser:
            uid = int(request.GET.get('auth', 0))
            if uid:
                try:
                    user = User.objects.get(pk=uid)
                    user.backend = 'django.contrib.auth.backends.ModelBackend'
                    auth.login(
                        request,
                        user
                    )
                    return HttpResponseRedirect("/")
                except User.DoesNotExist:
                    pass

    if headerValues['CURRENT_PROJECT']:
        arFilter['userRoles__in'] = PM_ProjectRoles.objects.filter(project=headerValues['CURRENT_PROJECT'])
        users = users.filter(**arFilter).distinct()

    # users = union(users, [request.user,])
    allUsersTaskQty = 0
    for user in users:
        userRoles = user.userRoles.filter(project__in=projects)
        setattr(user, 'roles_in_projects', userRoles)

        profile = user.get_profile()

        if profile.avatar:
            profile.avatar = str(profile.avatar).replace('PManager', '')

        tasks_quantity_mixin(user)
        if allUsersTaskQty < user.allTasksQty:
            allUsersTaskQty = user.allTasksQty

        setattr(user, 'profile', profile)
        if request.user.is_superuser:
            feeSum = 0
            s = Fee.objects.raw('select sum(value) as s, id from pmanager_fee where user_id='+str(user.id))
            for k in s:
                feeSum += k.s or 0

            setattr(user, 'feeSum', feeSum)

        try:
            if user.pk:
                startedTimer = PM_Timer.objects.get(user__id=user.pk, dateEnd=None)
                setattr(user, 'bHaveAccessToStartedTask', user.get_profile().isManager(startedTimer.task.project))
                setattr(user, 'startedTask', startedTimer.task)
        except PM_Timer.DoesNotExist:
            pass

        if not user.email and user.username.find('@'):
            setattr(user, 'email', user.username)


    return {
        'users': users,
        'allTasksQty': allUsersTaskQty or 1, #exclude division by zero in template
        'currentProject': int(request.GET.get('project', 0)),
        'title': u'Список пользователей'
    }