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')
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')
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()
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)
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')
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_, )
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")
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
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 )
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')))