def edit(self, id): c.order = h.checkorder(id) # Теперь - проверка прав доступа (админ либо ответственный подразделения, создавшего заявку) h.requirelogin() if not ( h.have_role("admin") or h.have_role("operator") or ( session.has_key("division") and (h.have_role("creator") and c.order.cust_id == session["division"]) or (h.have_role("responsible") and c.order.perf_id == session["division"]) ) ): abort(403) work = meta.Session.query(model.Work).order_by(model.Work.id).all() c.work = [] for i in work: c.work.append([i.id, i.title]) category = ( meta.Session.query(model.Category) .filter(model.Category.upcat_id == c.order.upper_category.id) .order_by(model.Category.id) .all() ) c.category = [] for i in category: c.category.append([i.id, i.title]) upcategory = ( meta.Session.query(model.UpperCategory).filter_by(deleted=False).order_by(model.UpperCategory.id).all() ) c.upcategory = [[None, u" -- выберите надкатегорию -- "]] for i in upcategory: c.upcategory.append([i.id, i.title]) return render("/orders/edit.html")
def take(self, id=None): order = h.checkorder(id) # Теперь - проверка прав доступа (ответственный подразделения, могущего выполнять заявки) if not (h.have_role("appointer") and order.status_id == 1): abort(403) elif h.have_role("guest"): abort(401) act = model.Action() act.order_id = order.id act.status = meta.Session.query(model.Status).get(2) act.div_id = session["division"] # Заполним исполнителей заявки for pid in self.form_result["performers"]: perf = meta.Session.query(model.Person).get(pid) act.performers.append(perf) order.order_performers.append(model.OrderPerformer(person=perf, current=True)) order.status = meta.Session.query(model.Status).get(2) order.perf_id = session["division"] meta.Session.add(act) # Готово! meta.Session.commit() h.flashmsg( u"Вы взяли заявку № " + h.strong(order.id) + u" для выполнения себе. Исполнители: %s" % (u", ".join([h.name(x) for x in act.performers])) ) redirect_to(h.url_for(controller="order", action="view", id=order.id))
def choose (self, id=None): c.order = h.checkorder(id) # Теперь - проверка прав доступа (ответственный подразделения, выполняющего заявки) if not (h.have_role('admin') or ((h.have_role("appointer")) and session.has_key('division') and c.order.perf_id == session['division'])): abort(403) actionquery = meta.Session.query(model.Action) #if actionquery.filter_by(div_id=c.order.perf_id).all() is None: # lastaction = None #else: # lastaction = actionquery.filter_by(div_id=c.order.perf_id).order_by(model.sql.desc(model.Action.created)).first() lastaction = actionquery.filter_by(order_id=id).filter_by(div_id=c.order.perf_id).filter(model.Action.status_id != 16).order_by(model.sql.desc(model.Action.created)).first() c.actions = actionquery.filter_by(order_id=id).order_by(model.Action.created).all() # Статусы statuses = meta.Session.query(model.Status).order_by(model.Status.gui_priority) if h.have_role('admin'): excluded_statuses = [1, 4, 6, 11, 12, 14] else: excluded_statuses = [1, 2, 4, 6, 11, 12, 14] c.statuses = [["", u" -- выберите -- "]] + [[status.id, status.title] for status in statuses if status.id not in excluded_statuses] # Люди-исполнители performers = meta.Session.query(model.Person).filter_by(deleted=False).filter_by(performer=True).order_by(model.Person.surname, model.Person.name, model.Person.name) if h.have_role('admin') and lastaction is not None: performers = performers.filter_by(div_id=lastaction.div_id) else: performers = performers.filter_by(div_id=session['division']) c.performers = [[user.id, h.name(user)] for user in performers] if lastaction is not None: c.curperfs = [x.id for x in c.order.performers] c.curdiv = lastaction.div_id if h.have_role("admin"): divlist = [x.div_id for x in meta.Session.query(model.Person.div_id).filter_by(performer=True).all()] c.divisions = [[x.id, x.title] for x in meta.Session.query(model.Division).filter_by(deleted=False).filter(model.Division.id.in_(divlist)).all()] return render("/actions/choose.html")
def save(self, id): order = h.checkorder(id) # Теперь - проверка прав доступа (админ либо ответственный подразделения, создавшего заявку) if not (h.have_role('admin') or h.have_role('operator') or (session.has_key('division') and (h.have_role('creator') and order.cust_id==session['division']) or (h.have_role('responsible') and order.perf_id==session['division']))): abort(401) for key, value in self.form_result.items(): if getattr(order, key) != value and key not in ['inventories', 'urgent']: setattr(order, key, value) # Не все могут помечать заявку важной if h.have_role('admin') or (session.has_key('division') and h.have_role('responsible') and order.perf_id==session['division']): setattr(order, 'urgent', bool(self.form_result.get('urgent'))) # Проверяем права # Изменяем отношения заявка <-> инвентарники for item in order.inventories: # Удаляем уже неактуальные отношения (удалённые при редактировании инвентарники) if item.id not in self.form_result['inventories']: order.inventories.remove(item) for inv in self.form_result['inventories']: # Добавляем новые отношения item = meta.Session.query(model.Inventory).get(inv); if not item: # <TODO text="Убрать добавление инвентарников в базу после введения проверок!"> item = model.Inventory() item.id = inv meta.Session.add(item) # </TODO> if item not in order.inventories: order.inventories.append(item) meta.Session.commit() h.flashmsg (u"Заявка была изменена") redirect_to(h.url_for(controller='order', action='view', id=order.id))
def index(self): qorder = meta.Session.query(model.Order).filter_by(deleted=False) # Filter old orders (more than 1 year old) max_age = request.params.get('max_age_in_days', '365') if len(max_age) and max_age != 'unlimited': qorder = qorder.filter("age(orders.created) < interval ':age days'").params(age=int(max_age)) freeorders = qorder.filter_by(status_id=1) # .limit(10) # if (session.get('preferences') or dict()).get('upcat') is not None: c.upcat = meta.Session.query(model.UpperCategory).filter_by(url_text=session['preferences']['upcat']).one() freeorders = freeorders.filter_by(upcat_id=c.upcat.id) c.numfree = freeorders.count() c.freeorders = freeorders.order_by(model.sql.desc(model.Order.created))[:10] if session.has_key('division') and h.have_role('performer'): #session.has_key('performer') and session['performer']: # Заявки, выполняемые моим подразделением c.mydivorders = qorder.filter("status_id<>:value and perf_id=:perf").params(value=4, perf=session['division']).order_by(model.sql.desc(model.Order.created))[:10] # Заявки, выполняемые мной myperf = qorder.filter(model.sql.not_(model.Order.status_id.in_([1, 3, 4, 5]))) myperf = myperf.filter(model.Order.performers.any(id=session['id'])) c.myperforming = myperf.order_by(model.Order.created)[:10] # Жалобы! c.complaints = qorder.filter("status_id=:value and perf_id=:perf").params(value=6, perf=session['division']).order_by(model.Order.created).all() if session.has_key('division') and session.has_key('creator') and session['creator']: c.myownorders = qorder.filter("cust_id=:div").params(div=session['division']).order_by(model.sql.desc(model.Order.created))[:10] orderstoapprove = qorder.filter("status_id=:value and cust_id=:perf").params(value=3, perf=session['division']) c.orderstoapprove = orderstoapprove.order_by(model.Order.created)[:10] c.numtoapprove = orderstoapprove.count() # Немножко статистики на главную c.ordercount = meta.Session.query(model.Order).filter_by(deleted=False).count() statuses = meta.Session.query(model.Status).filter(model.Status.redirects==model.Status.id)\ .order_by(model.Status.id).all() c.ordercountbystatus = [(unicode(status.title), status.ordercount) for status in statuses] return render('/main.html')
def _to_python(self, value, state): user = meta.Session.query(model.Person).get(int(request.urlvars['id'])) if not h.have_role('admin') and md5(value.encode('utf-8')).hexdigest() != user.password: raise formencode.Invalid( self.message('invalid', state), value, state) return value
def revoke(self, id=None): """Отзыв заявки её создателем (например, решили проблему сами или «ложная тревога»).""" order = h.checkorder(id) # Заявка должна быть свободна! if order.status.id != 1: abort(403) # Проверка прав доступа (админ либо ответственный подразделения, создавшего заявку) if not ( h.have_role("admin") or ( session.has_key("division") and session.has_key("creator") and session["creator"] and order.cust_id == session["division"] ) ): abort(401) # Заявка готова, но никто её не сделал order.status = meta.Session.query(model.Status).get(15) order.performers = [] order.performer = None # Добавление записи в журнал действий над заявкой act = model.Action() act.order_id = order.id act.status = meta.Session.query(model.Status).get(15) act.division = meta.Session.query(model.Division).get(session["division"]) act.performers.append(meta.Session.query(model.Person).get(session["id"])) if session.has_key("operator_id") and session["id"] != session["operator_id"]: act.performers.append(meta.Session.query(model.Person).get(session["operator_id"])) meta.Session.add(act) # Готово meta.Session.commit() h.flashmsg(u"Заявка № " + h.strong(order.id) + u" отозвана.") redirect_to(h.url_for(controller="order", action="view", id=order.id))
def makethank (self): order = meta.Session.query(model.Order).filter_by(id=self.form_result['id']).first() if order is None: abort(404) if order.deleted: abort(410) # Теперь - проверка прав доступа (ответственный подразделения, подавшего эту заявку) if not (session.has_key('division') and session['division']): abort(401) if not (h.have_role('creator') and order.cust_id == session['division']): abort(403) thank = model.Action() thank.order_id = order.id thank.status = meta.Session.query(model.Status).get(14) thank.div_id = session['division'] perf = meta.Session.query(model.Person).get(session['id']) thank.performers.append(perf) # Если претензию подаёт оператор, то и его добавим if session.has_key("operator_id") and session["id"] != session["operator_id"]: thank.performers.append(meta.Session.query(model.Person).get(session["operator_id"])) thank.description = self.form_result['description'] meta.Session.add (thank) meta.Session.commit() h.flashmsg (u"Спасибо за " + h.literal("«") + u"спасибо" + h.literal("»") + "!") redirect_to(h.url_for(controller='order', action='view', id=order.id))
def makecomplaint (self): order = meta.Session.query(model.Order).filter_by(id=self.form_result['id']).first() if order is None: abort(404) if order.deleted: abort(410) # Теперь - проверка прав доступа (ответственный подразделения, подавшего эту заявку) if not (session.has_key('division') and session['division']): abort(401) if not (h.have_role('creator') and order.cust_id == session['division']): abort(403) complaint = model.Action() complaint.order_id = order.id complaint.status = meta.Session.query(model.Status).get(6) complaint.div_id = session['division'] perf = meta.Session.query(model.Person).get(session['id']) complaint.performers.append(perf) # Если претензию подаёт оператор, то и его добавим if session.has_key("operator_id") and session["id"] != session["operator_id"]: complaint.performers.append(meta.Session.query(model.Person).get(session["operator_id"])) complaint.description = self.form_result['description'] meta.Session.add (complaint) order.status = meta.Session.query(model.Status).get(6) # Обновляем создателей заявки if perf not in order.customers: order.customers.append(perf) meta.Session.commit() h.flashmsg (u"Жалоба подана. Всех лишат зарплаты. Дело заявки № " + h.strong(order.id) + u" будет сделано.") redirect_to(h.url_for(controller='order', action='view', id=order.id))
def save(self, id): h.requirelogin() div = h.checkdiv(id) if not (h.have_role('admin') or (session.get('division')==div.id and (session.get('chief') or session.get('responsible')))): abort(403) for key, value in self.form_result.items(): if getattr(div, key) != value: setattr(div, key, value) meta.Session.commit() h.flashmsg (u"Информация о подразделении была сохранена") redirect_to(h.url_for(controller='division', action='view', id=div.id))
def takerequest (self, id=None): c.order = h.checkorder(id) # Теперь - проверка прав доступа if not (h.have_role('appointer') and c.order.status_id==1): abort(401) c.division = meta.Session.query(model.Division).get(int(session['division'])) performers = meta.Session.query(model.Person).filter_by(deleted=False)\ .filter_by(div_id=session['division']).filter_by(performer=True).order_by(model.Person.surname).all() c.performers = [] for user in performers: c.performers.append([user.id, h.name(user)]) return render ("/orders/take.html")
def _to_python(self, value, state): value = int(value) if not h.have_role('admin'): if value != int(session.get('division')): raise formencode.Invalid( u"Попытка взлома? Передан код подразделения %d, а должен быть %d."%(value,session.get('division')), value, state ) else: divlist = [int(x.div_id) for x in meta.Session.query(model.Person.div_id).filter_by(performer=True).group_by(model.Person.div_id)] if value not in divlist: raise formencode.Invalid( u"Неверное подразделение: Передано %s, а должно быть одним из %s."%(value,divlist), value, state ) return value
def create(self): """Метод непосредственного создания заявки в БД""" h.requirerights("creator") c.order = model.Order() # Создание заявки c.order.status = meta.Session.query(model.Status).get(1) # Заявка свободна! c.order.cust_id = session["division"] # Заявка исходит от подразделения текущего пользователя for key, value in self.form_result.items(): if key != "inventories": # Всё прочее, кроме инвентарников setattr(c.order, key, value) # тащим из формы прямо в базу # Не все могут помечать заявку важной if h.have_role("admin"): setattr(c.order, "urgent", bool(self.form_result["urgent"])) meta.Session.add(c.order) # Добавляем отношения заявка <-> инвентарники for inv in self.form_result["inventories"]: item = meta.Session.query(model.Inventory).get(inv) # <TODO text="Убрать добавление инвентарников в базу после введения проверок!"> if not item: item = model.Inventory() item.id = inv meta.Session.add(item) # </TODO> c.order.inventories.append(item) # Создаём первую запись в журнале - "заявка создана" act = model.Action() act.div_id = session["division"] perf = meta.Session.query(model.Person).get(session["id"]) act.performers.append(perf) if session.has_key("operator_id") and session["id"] != session["operator_id"]: act.status = meta.Session.query(model.Status).get(12) # Сообщаем, если создаёт оператор (и добавляем его) act.performers.append(meta.Session.query(model.Person).get(session["operator_id"])) else: act.status = meta.Session.query(model.Status).get(11) # Или если просто сам пользователь act.order_id = c.order.id meta.Session.add(act) # Обновляем создателей заявки c.order.customers.append(perf) # Готово, в базу! meta.Session.commit() h.flashmsg(u"Заявка № " + h.strong(c.order.id) + u" была добавлена.") redirect_to(h.url_for(controller="order", action="view", id=c.order.id))
def thank (self, id=None): # Если номер заявки не указан, то позволим выбрать. if id is not None: c.order = h.checkorder(id) if not session.has_key('division'): abort(401) elif c.order.cust_id != session['division']: abort(403) c.selectedorder = c.order.id else: c.selectedorder = None if not h.have_role('creator'): abort(403) orders = meta.Session.query(model.Order).filter("status_id<>:value and cust_id=:customer").params(value=4, customer=session['division']).all() c.orders =[['', u'-- выберите заявку, выполнением которой вы остались довольны --']] for order in orders: if h.can_complain(order): if len(order.title) > 32: order.title = order.title[:32] + u"…" str = unicode(order.id) + ". [" + order.work.title + h.literal(" — ") + order.category.title + "]: " + order.title c.orders.append([order.id, str]) return render("/actions/thank.html")
def edit(self, id=None): h.requirelogin() div = h.checkdiv(id) if not (h.have_role('admin') or (session.get('division')==div.id and (session.get('chief') or session.get('responsible')))): abort(403) users = meta.Session.query(model.Person).all() c.users = [] for i in users: c.users.append([i.id, h.name(i)]) #qmembers = meta.Session.query(model.Person).filter_by(division=div.id).all() members = [] for i in div.people: members.append(i.id) values = { 'title': div.title, 'address': div.address, 'description': div.description, 'email': div.email, 'phone': div.phone, 'users': members, } return htmlfill.render(render("/divisions/edit.html"), values)
def approve (self, id): order = h.checkorder(id) # Теперь - проверка прав доступа (ответственный подразделения, подавшего эту заявку) if not (session.has_key('division') and order.cust_id == session['division'] and order.status_id == 3 and (h.have_role('appointer') or h.have_role('responsible') or h.have_role('chief') or h.have_role('creator'))): abort(403) approval = model.Action() approval.order_id = order.id approval.status = meta.Session.query(model.Status).get(4) approval.div_id = session['division'] #approval.performer = session['id'] perf = meta.Session.query(model.Person).get(session['id']) approval.performers.append(perf) meta.Session.add (approval) order.status = meta.Session.query(model.Status).get(4) # Обновляем создателей заявки if perf not in order.customers: order.customers.append(perf) meta.Session.commit() h.flashmsg (u"Заявка № " + h.strong(order.id) + u" полностью выполнена.") redirect_to(h.url_for(controller='order', action='view', id=order.id))
def act (self, id): order = h.checkorder(id) # Теперь - проверка прав доступа (ответственный подразделения, выполняющего эту заявку) if not (h.have_role('admin') or ((h.have_role("appointer")) and session.has_key('division') and order.perf_id == session['division'])): abort(403) lastaction = meta.Session.query(model.Action).order_by(model.sql.desc(model.Action.created)).first() if lastaction.status_id == self.form_result['status'] and [x.id for x in lastaction.performers] == self.form_result['performers']: h.flashmsg (u"Нельзя повторять статусы!") redirect_to(h.url_for(controller='action', action='choose', id=order.id)) return u"Ай-яй-яй!" status = meta.Session.query(model.Status).get(int(self.form_result['status'])) act = model.Action() act.order_id = order.id act.status = status act.div_id = session['division'] act.description = self.form_result['description'] current_user = meta.Session.query(model.Person).get(int(session['id'])) current_user_is_acting = current_user.id in map(lambda x: int(x), self.form_result['performers']) if status.id == 16 and not current_user_is_acting: # Пояснение делает сам пользователь вне зависимости от того, кому даётся трудоёмкость! act.action_performers = [model.ActionPerformer(person=current_user, workload=Decimal('0.0'))] for index, p_id in enumerate(self.form_result['performers']): perf = meta.Session.query(model.Person).get(p_id) workload = Decimal(self.form_result['workloads'][index]) if perf in order.performers: workload -= filter(lambda x: x.person_id == p_id, order.order_performers)[0].workload if workload < 0 and not h.have_role('admin'): workload = 0 act.action_performers.append(model.ActionPerformer(person=perf, workload=workload)) # Обновляем исполнителей заявки if status.redirects == 1: # «Очищаем» список исполнителей, если заявка становится свободной for op in order.order_performers: op.current = False else: new_performers = list(set(act.performers) - set(order.performers)) ex_performers = list(set(order.performers) - set(act.performers)) same_performers = list(set(act.performers) & set(order.performers)) for op in order.order_performers: if status.id == 16 and op.person.id == current_user.id and not current_user_is_acting: op.current = False # Устанавливаем новую трудоёмкость существующим исполнителям elif op.person in same_performers: ap = filter(lambda p: p.person_id == op.person_id, act.action_performers)[0] op.workload += ap.workload op.current = True # Снимаем флаг участия с бывших исполнителей elif op.person in ex_performers: op.current = False # Добавляем новых исполнителей for ap in act.action_performers: if ap.person in new_performers: order.order_performers.append(model.OrderPerformer(person=ap.person, workload=ap.workload)) # Update a workload of entire order order.workload = sum(map(lambda x: x.workload, order.order_performers)) meta.Session.add(act) # Если указан перевод состояния заявки - переводим в него. Иначе оставляем как есть. if status.redirects: order.status = meta.Session.query(model.Status).get(status.redirects) order.perf_id = session['division'] # Если это "отметить выполненной", то ставим заявке время выполнения if status.id == 3: order.doneAt = datetime.datetime.now() # Изменяем отношения заявка <-> инвентарники for item in order.inventories: # Удаляем уже неактуальные отношения (удалённые при редактировании инвентарники) if item.id not in self.form_result['inventories']: order.inventories.remove(item) for inv in self.form_result['inventories']: # Добавляем новые отношения item = meta.Session.query(model.Inventory).get(inv); if not item: # <TODO text="Убрать добавление инвентарников в базу после введения проверок!"> item = model.Inventory() item.id = inv meta.Session.add(item) # </TODO> if item not in order.inventories: order.inventories.append(item) # Готово meta.Session.commit() h.flashmsg (u"Статус заявки № " + h.strong(order.id) + u" был изменён на " + h.strong(order.status.title) + u".") meta.Session.expire_all() redirect_to(h.url_for(controller='order', action='view', id=order.id))