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 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 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 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 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 changepassword (self, id=None): user = h.checkuser(id) h.requirerights(user_is=id) user.password = md5(self.form_result['newpass'].encode('utf-8')).hexdigest() meta.Session.commit() h.flashmsg (u"Пароль был изменён") redirect_to(h.url_for(controller='usercontrol', action='list', id=None))
def delete(self, id=None): h.requirerights("admin") user = h.checkuser(id) #meta.Session.delete(user) user.deleted = True meta.Session.commit() h.flashmsg (u"Пользователь был удалён") redirect_to(h.url_for(controller='usercontrol', action='list', id=None))
def delete(self, id): h.requirerights("admin") order = h.checkorder(id) # meta.Session.delete(order) order.deleted = True meta.Session.commit() h.flashmsg(u"Заявки № " + h.strong(order.id) + u" больше нет.") redirect_to(h.url_for(controller="order", action="list", id=None))
def create(self): h.requirerights("admin") div = model.Division() for key, value in self.form_result.items(): setattr(div, key, value) meta.Session.add(div) meta.Session.commit() h.flashmsg (u"Подразделение " + h.literal("«") + div.title + h.literal("»") + " добавлено.") redirect_to(h.url_for(controller='division', action='view', id=div.id))
def dologin(self): session.clear() qloginer = meta.Session.query(model.Person) person = qloginer.filter_by(login=self.form_result['login']).first() # Загрузка информации о человеке и его правах доступа h.refresh_account(person.id) # Велкам! session['flash'] = u"Вы успешно вошли в систему" session.save() redirect_to(h.url_for(controller="main", action="index"))
def filter(self, **kwargs): redirect_to( h.url_for( controller="order", action="list", upcat=(request.params.get("upcat", None) or kwargs.get("upcat", "any")), cat=request.params.get("cat", "any"), work=request.params.get("work", "any"), status=request.params.get("status", "any"), ) )
def delete(self, id=None): h.admincheck() div = h.checkdiv(id) # Стараемся не оставить людей сиротами for user in div.people: user.deleted = True #meta.Session.delete(div) div.deleted = True meta.Session.commit() h.flashmsg (u"Подразделение было удалено") redirect_to(h.url_for(controller='division', action='list', id=None))
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 saveprefs (self): user = h.checkuser(session['id']) user.preferences = dict() for key,value in self.form_result.iteritems(): if value == u"None": user.preferences[key] = None else: user.preferences[key] = value meta.Session.commit() h.flashmsg (u"Ваши настройки были бережно сохранены...") redirect_to(h.url_for(controller="main", action="index"))
def fix (self): '''Исправляет права доступа для администратора и его группы (id равны единице!)''' admin = meta.Session.query(model.Person).get(1) admin.division = 1 adiv = meta.Session.query(model.Person).get(1) adiv.owner = 1 adiv.admin = True meta.Session.commit() session['flash'] = "Администратор исправлен!" session.save() redirect_to(h.url_for(controller="main", action="index"))
def create(self): h.requirerights("admin") user = model.Person() password = md5(self.form_result['password'].encode('utf-8')).hexdigest() for key, value in self.form_result.items(): if key not in ["passcheck"]: setattr(user, key, value) user.password = password meta.Session.add(user) meta.Session.commit() h.flashmsg (u"Пользователь был добавлен.") redirect_to(h.url_for(controller='usercontrol', action='view', id=user.id))
def save(self, id=None): user = h.checkuser(id) h.requirerights(user_is=id) if session.has_key('admin') and session['admin']: for key, value in self.form_result.items(): if getattr(user, key) != value: setattr(user, key, value) else: for key, value in self.form_result.items(): if key in ['name', 'surname', 'patronymic', 'email', 'phone']: if getattr(user, key) != value: setattr(user, key, value) meta.Session.commit() h.flashmsg (u"Информация о пользователе была обновлена. ДА!") redirect_to(h.url_for(controller='usercontrol', action='view', id=user.id))
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 changeusers(self, id=None): h.admincheck() div = h.checkdiv(id) user = meta.Session.query(model.Person) userlist = eval(self.form_result['users']) # Сначала удалим всех нафиг oldusers = user.filter_by(div_id=id).all() for person in oldusers: person.div_id = None # Вносим в список новых пользователей try: users = user.filter(model.Person.id.in_(userlist)).all() for person in users: person.div_id = div.id except TypeError: # Если элемент один, то ругается, что Int не iterable user.get(userlist).div_id = div.id # Сохраняемся meta.Session.commit() h.flashmsg (u"Информация о подразделении была сохранена") redirect_to(h.url_for(controller='division', action='view', id=id))
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 switchback (self): if session.has_key("operator_id"): h.refresh_account(session.get("operator_id")) redirect_to(h.url_for(controller="usercontrol", action="switch", id=None))
def doswitch (self): h.requirerights("operator") h.refresh_account(self.form_result["user_id"], session.get("id")) h.flashmsg (u"Теперь вы под другим пользователем. Нажмите 'вернуться' вверху, чтобы вернуться в свою учётную запись.") redirect_to(h.url_for(controller="order", action="add", id=None))
def goto (self): redirect_to(h.url_for(controller='order', action='view', id=self.form_result['id']))
def logout(self): session.clear() session['flash'] = u"Вы вышли из системы" session.save() redirect_to(h.url_for(controller="main", action="index", id=None))
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))
def index(self): return redirect_to(h.url_for(action="list"))
def goto(self): redirect_to(h.url_for(controller="order", action="view", id=self.form_result["id"]))
def find(self): redirect_to(h.url_for(controller="order", action="list", searchvalue=request.params["searchvalue"]))
def filter(self, **kwargs): redirect_to(h.url_for(controller='order', action='list', upcat=(request.params.get('upcat', None) or kwargs.get('upcat', 'any')), \ cat=request.params.get('cat','any'), work=request.params.get('work', 'any'), status=request.params.get('status', 'any')))