Example #1
0
def add_time(user_id, date, bug_id, project_id, hours, subject):
    # try finding existing entry for this bug
    session = DBSession()
    bug_id = str(bug_id)
    entry = TimeEntry.query.filter(TimeEntry.user_id==user_id) \
                           .filter(TimeEntry.date==date.date()) \
                           .filter(TimeEntry.ticket_id==bug_id) \
                           .filter(TimeEntry.project_id==project_id).first()
    if not entry:
        # create new entry
        entry = TimeEntry(user_id=user_id,
                          date=date.date(),
                          time=hours,
                          description=subject,
                          ticket_id=bug_id,
                          project_id=project_id,
                          modified_ts=date)
        session.add(entry)
        LOG(u'Adding new entry')
    else:
        # update existing entry
        if not entry.frozen:
            entry.time += hours
            entry.modified_ts = date  # TODO: this might remove an already existing lateness
            session.add(entry)
            LOG(u'Updating existing entry')
        else:
            LOG(u'Omission of an existing entry because it is frozen')
Example #2
0
def add_time(user_id, date, bug_id, project_id, hours, subject):
    # try finding existing entry for this bug
    session = DBSession()
    bug_id = str(bug_id)
    entry = TimeEntry.query.filter(TimeEntry.user_id==user_id) \
                           .filter(TimeEntry.date==date.date()) \
                           .filter(TimeEntry.ticket_id==bug_id) \
                           .filter(TimeEntry.project_id==project_id).first()
    if not entry:
        # create new entry
        entry = TimeEntry(
            user_id=user_id,
            date=date.date(),
            time=hours,
            description=subject,
            ticket_id=bug_id,
            project_id = project_id,
            modified_ts=date
        )
        session.add(entry)
        LOG(u'Adding new entry')
    else:
        # update existing entry
        if not entry.frozen:
            entry.time += hours
            entry.modified_ts = date # TODO: this might remove an already existing lateness
            session.add(entry)
            LOG(u'Updating existing entry')
        else:
            LOG(u'Omission of an existing entry because it is frozen')
Example #3
0
    def on_retrieve(self, lines):
        """ When single message was retrieved """
        msg = email.message_from_string('\n'.join(lines))
        sender = decode(msg['From'])
        tracker = self.match_tracker(msg)
        if tracker is None:
            DEBUG(u'Email from %s ignored, no tracker matched' % (sender, ))
            return

        # find appopriate handler
        handler = getattr(self, 'handle_%s_email' % tracker.type)
        # handler should parse the response and return essential info or None
        data = handler(msg, tracker)
        if data is None: # email should be ignored
            return
        user_id, date, bug_id, project_id, hours, subject = data

        # try finding existing entry for this bug
        session = DBSession()
        bug_id = str(bug_id)
        entry = TimeEntry.query.filter(TimeEntry.user_id==user_id)\
                               .filter(TimeEntry.date==date.date())\
                               .filter(TimeEntry.ticket_id==bug_id)\
                               .filter(TimeEntry.project_id==project_id)\
                               .first()
        if not entry:
            # create new entry
            entry = TimeEntry(
                user_id=user_id,
                date=date.date(),
                time=hours,
                description=subject,
                ticket_id=bug_id,
                project_id = project_id,
                modified_ts=date
            )
            session.add(entry)
            LOG(u'Adding new entry')
        else:
            # update existing entry
            if not entry.frozen:
                entry.time += hours
                entry.modified_ts = date # TODO: this might remove an already existing lateness
                session.add(entry)
                LOG(u'Updating existing entry')
            else:
                LOG(u'Omission of an existing entry because it is frozen')
        transaction.commit()
Example #4
0
    def post(self):
        if not self.request.is_xhr:
            return HTTPBadRequest()

        date = self.v['date']
        form = TimeEntryForm(self.request.POST)

        if form.validate():
            project_id = form.project_id.data
            time = TimeEntry(date=date,
                             user_id=self.request.user.id,
                             time=form.time.data,
                             description=form.description.data,
                             ticket_id=form.ticket_id.data,
                             project_id=project_id if project_id else None)
            DBSession.add(time)
            LOG(u'Ajax - Time entry added')

            entries = self._get_time_entries(date)
            total_sum = sum(entry.time for (tracker, entry) in entries
                            if not entry.deleted)
            template = render('/times/_list.html',
                              dict(entries=entries, total_sum=total_sum),
                              request=self.request)

            return dict(status='success', html=template)

        errors = u'<br />'.join((u"%s - %s" % (field, u', '.join(errors))
                                 for field, errors in form.errors.iteritems()))
        return dict(status='error', errors=errors)
Example #5
0
    def post(self):
        user, date = self.v['user'], self.v['date']

        try:
            schema = AddEntrySchema()
            data = schema.deserialize(self.request.POST)
        except colander.Invalid as e:
            return HTTPBadRequest(e.asdict())

        project_id = data.get('project_id')
        project = Project.query.get(project_id)
        if not project:
            raise HTTPBadRequest("Project is required")

        time = TimeEntry(
            date=date,
            user_id=user.id,
            time=data.get('time'),
            description=data.get('description'),
            ticket_id=data.get('ticket_id'),
            project_id=project_id if project_id else None,
            timer_ts=datetime.datetime.now() if data.get('timer') else None,
            frozen=bool(data.get('start_timer')))
        self.session.add(time)

        return HTTPCreated('OK')
Example #6
0
    def post(self):
        timeentry = self.v['timeentry']

        next_ = self.request.GET.get('next')
        if not next_:
            next_ = self.request.url_for(
                '/times/list',
                date=timeentry.date.strftime('%d.%m.%Y'),
            )

        form = TimeEntryForm(self.request.POST, obj=timeentry)
        date = timeentry.date
        today = datetime.date.today()

        if form.validate():
            if timeentry.project_id != int(
                    form.project_id.data) and today > date:
                timeentry.deleted = True
                timeentry.modified_ts = datetime.datetime.now()
                time = TimeEntry(date=date,
                                 user_id=timeentry.user_id,
                                 time=form.time.data,
                                 description=form.description.data,
                                 ticket_id=form.ticket_id.data,
                                 project_id=form.project_id.data
                                 if form.project_id.data else None,
                                 timer_ts=datetime.datetime.now()
                                 if form.timer.data else None)
                DBSession.add(time)
            else:
                ticket_id = form.ticket_id.data

                if timeentry.time != form.time.data or\
                   timeentry.project_id != form.project_id.data:
                    timeentry.modified_ts = datetime.datetime.now()

                timeentry.time = form.time.data
                timeentry.description = form.description.data
                timeentry.ticket_id = ticket_id
                timeentry.project_id = form.project_id.data if form.project_id.data else None

            self.flash(self._(u'Time entry saved'))
            LOG(u'Time entry saved')
            return HTTPFound(next_)

        return dict(
            timeentry_id=timeentry.id,
            form=form,
            date=date,
            next=next_,
        )
Example #7
0
    def put(self):
        timeentry = self.v['timeentry']
        today = datetime.date.today()

        try:
            schema = EditEntrySchema()
            data = schema.deserialize(self.request.POST)
        except colander.Invalid as e:
            return HTTPBadRequest(e.asdict())

        if timeentry.project_id != data.get(
                'project_id') and today > timeentry.date:
            timeentry.deleted = True
            timeentry.modified_ts = datetime.datetime.now()

            time = TimeEntry(
                date=timeentry.date,
                user_id=timeentry.user_id,
                time=data.get('time'),
                description=data.get('description'),
                ticket_id=data.get('ticket_id'),
                project_id=data.get('project_id'),
                timer_ts=datetime.datetime.now()
                if data.get('timer') else None,
            )
            self.session.add(time)
        else:
            if timeentry.time != data.get('time') or \
               timeentry.project_id != data.get('project_id'):
                timeentry.modified_ts = datetime.datetime.now()

            timeentry.time = data.get('time')
            timeentry.description = data.get('description')
            timeentry.ticket_id = data.get('ticket_id')
            timeentry.project_id = data.get('project_id')

        return HTTPOk("OK")
Example #8
0
    def post(self):
        absence = self.request.json.get('absence')
        form = AbsentApplicationForm(MultiDict(**absence),
                                     request=self.request)
        if form.validate():
            response = {
                u'request': False,
                u'hours': False,
                u'calendar_entry': False,
            }

            memcache.clear()

            date_start = form.popup_date_start.data
            date_end = form.popup_date_end.data
            days = 0
            if date_start and date_end:
                days = h.get_working_days(date_start, date_end)
            type = form.popup_type.data
            remarks = form.popup_remarks.data
            absence = Absence(
                user_id=self.request.user.id,
                date_start=date_start,
                date_end=date_end,
                days=days,
                type=type,
                remarks=remarks,
            )

            DBSession.add(absence)
            memcache.delete(MEMCACHED_NOTIFY_KEY % date_start)

            if absence.type != 'inne':
                holidays = Holiday.all()
                date = date_start
                oneday = datetime.timedelta(days=1)
                description = self._(u'Auto Leave: ${type} - ${remarks}',
                                     type=dict(ABSENCE_TYPES)[type],
                                     remarks=remarks)
                project_id = L4_PROJECT_ID if type == u'l4' else LEAVE_PROJECT_ID

                while date <= date_end:
                    if not Holiday.is_holiday(date, holidays=holidays):
                        timeentry = TimeEntry(
                            user_id=self.request.user.id,
                            date=date,
                            time=8,
                            description=description,
                            project_id=project_id,
                        )
                        DBSession.add(timeentry)
                    date += oneday

                self._send_email(
                    absence.type,
                    date_start.strftime('%Y-%m-%d'),
                    date_end.strftime('%Y-%m-%d'),
                    days,
                    remarks,
                )

                response[u'request'] = True
                response[u'hours'] = True

            calendar = cal.Calendar(self.request.user)
            event = cal.Event(date_start, date_end + cal.oneday,
                              u'NIEOB-[%s]' % self.request.user.name, remarks)
            event_id = calendar.addEvent(event)

            response[u'calendar_entry'] = bool(event_id)

            return response

        self.request.response.status = 400
        return form.errors
Example #9
0
    def dispatch(self):
        form = AbsentApplicationForm(self.request.POST, request=self.request)
        days, mandated, used, left = 0, 0, 0, 0
        if form.popup_date_start.data:
            mandated, used, left = user_leave(self.request, form.popup_date_start.data.year)
            if form.popup_date_end.data:
                days = h.get_working_days(form.popup_date_start.data, form.popup_date_end.data)
                left -= days
        if self.request.method == 'POST' and form.validate():
            memcache.clear()
            response = u''
            date_start = form.popup_date_start.data
            date_end = form.popup_date_end.data
            type = form.popup_type.data
            remarks = form.popup_remarks.data
            absence = Absence(
                user_id=self.request.user.id,
                date_start=date_start,
                date_end=date_end,
                days=days,
                type=type,
                remarks=remarks,
            )
            memcache.delete(MEMCACHED_NOTIFY_KEY % date_start)
            self.session.add(absence)

            if absence.type != 'inne':
                # let's add timeentries for this leave
                holidays = Holiday.all()
                date = date_start
                oneday = datetime.timedelta(days=1)
                description = self._(u'Auto Leave: ${type} - ${remarks}',
                    type=dict(ABSENCE_TYPES)[type],
                    remarks=remarks
                )
                project_id = L4_PROJECT_ID if type == u'l4' else LEAVE_PROJECT_ID

                while date <= date_end:
                    if not Holiday.is_holiday(date, holidays=holidays):
                        timeentry = TimeEntry(
                            user_id=self.request.user.id,
                            date=date,
                            time=8,
                            description=description,
                            project_id=project_id,
                        )
                        self.session.add(timeentry)
                    date += oneday

                ## let's send email
                deferred = self._send_mail(
                    absence.type,
                    date_start.strftime('%Y-%m-%d'),
                    date_end.strftime('%Y-%m-%d'),
                    days,
                    remarks,
                )
                response += self._(u'Request added<br>Hours added<br>')

            ## and add event to calendar:
            calendar = cal.Calendar(self.request.user)
            event = cal.Event(
                date_start,
                date_end+cal.oneday,
                u'NIEOB-[%s]' % self.request.user.name,
                remarks,
            )
            event_id = calendar.addEvent(event)

            if event_id:
                response += self._(u'Calendar entry has been added')
            else:
                response += u'Calendar entry has <b class="red">NOT</b> beed added'

            return Response(response)

        return dict(
            form=form,
            days=days,
            mandated=mandated,
            used=used,
            left=left
        )
Example #10
0
    def post(self):
        date = self.v['date']
        form = AddTimeEntryForm(self.request.POST)

        if self.request.POST.get('start_timer'):
            form.timer.data = u'1'
            if not form.time.data:
                form.time.data = 0.0
        else:
            form.timer.data = u''

        user = self.v.get('user', self.request.user)

        next_ = self.request.GET.get('next')
        if not next_:
            next_ = self.request.url_for('/times/list',
                                         date=date.strftime('%d.%m.%Y'))

        if form.validate():
            now = datetime.datetime.now()
            project_id = form.project_id.data
            project = Project.query.get(project_id) if project_id else None
            if isinstance(form.ticket_id.data, __builtin__.list):
                count = len(form.ticket_id.data)
                for ticket_id in form.ticket_id.data:
                    time = TimeEntry(
                        date=date,
                        user_id=user.id,
                        time=form.time.data / count,
                        description=form.description.data,
                        ticket_id=ticket_id,
                        project_id=project_id if project_id else None,
                        timer_ts=datetime.datetime.now()
                        if form.timer.data and count == 1 else None,
                        frozen=bool(self.request.POST.get('start_timer'))
                        and count == 1)
                    DBSession.add(time)
            else:
                time = TimeEntry(date=date,
                                 user_id=user.id,
                                 time=form.time.data,
                                 description=form.description.data,
                                 ticket_id=form.ticket_id.data,
                                 project_id=project_id if project_id else None,
                                 timer_ts=datetime.datetime.now()
                                 if form.timer.data else None,
                                 frozen=bool(
                                     self.request.POST.get('start_timer')))
                DBSession.add(time)

            if form.add_to_harvest.data:
                self._add_to_harvest(form)
            self.flash(self._(u'Time entry added'))
            LOG(u'Time entry added')

            return HTTPFound(location=next_)
        return dict(user=user,
                    date=date,
                    form=form,
                    next=next_
                    or self.request.url_for('/times/list',
                                            date=date.strftime('%d.%m.%Y')))