Exemplo n.º 1
0
 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)) 
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
 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))
Exemplo n.º 4
0
 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)) 
Exemplo n.º 5
0
 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))
Exemplo n.º 6
0
 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))
Exemplo n.º 7
0
 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))
Exemplo n.º 8
0
 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))
Exemplo n.º 9
0
 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("&laquo;") + div.title + h.literal("&raquo;") + " добавлено.")
     redirect_to(h.url_for(controller='division', action='view', id=div.id))
Exemplo n.º 10
0
 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))
Exemplo n.º 11
0
 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))
Exemplo n.º 12
0
 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"))
Exemplo n.º 13
0
 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))
Exemplo n.º 14
0
 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))
Exemplo n.º 15
0
 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))
Exemplo n.º 16
0
 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))
Exemplo n.º 17
0
 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))         
Exemplo n.º 18
0
 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))
Exemplo n.º 19
0
 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))