示例#1
0
文件: order.py 项目: AmurSU/orderman
 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")
示例#2
0
文件: order.py 项目: AmurSU/orderman
 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))
示例#3
0
文件: action.py 项目: AmurSU/orderman
 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")
示例#4
0
文件: order.py 项目: Envek/orderman
 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))
示例#5
0
文件: main.py 项目: AmurSU/orderman
    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')
示例#6
0
 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
示例#7
0
文件: order.py 项目: AmurSU/orderman
 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))
示例#8
0
文件: action.py 项目: AmurSU/orderman
 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("&laquo;") + u"спасибо" + h.literal("&raquo;") + "!")
     redirect_to(h.url_for(controller='order', action='view', id=order.id)) 
示例#9
0
文件: action.py 项目: AmurSU/orderman
 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)) 
示例#10
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))
示例#11
0
文件: order.py 项目: Envek/orderman
 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")
示例#12
0
文件: action.py 项目: AmurSU/orderman
 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
示例#13
0
文件: order.py 项目: AmurSU/orderman
 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))
示例#14
0
文件: action.py 项目: AmurSU/orderman
 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(" &mdash; ") + order.category.title + "]: " + order.title
             c.orders.append([order.id, str])
     return render("/actions/thank.html")
示例#15
0
 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)
示例#16
0
文件: action.py 项目: AmurSU/orderman
 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))         
示例#17
0
文件: action.py 项目: AmurSU/orderman
 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))