コード例 #1
0
 def create_daily_records (self) :
     self.set_request ()
     request         = self.request
     filterspec      = request.filterspec
     columns         = request.columns
     assert (request.classname == 'daily_record')
     start, end      = common.date_range (self.db, filterspec)
     self.start      = start
     self.end        = end
     max             = start + Interval ('31d')
     if end > max :
         msg = \
             ( "Error: Interval may not exceed one month: %s"
             % ' to '.join ([i.pretty (common.ymd) for i in (start, end)])
             )
         end = max
         request.filterspec ['date'] = common.pretty_range (start, end)
         url = request.indexargs_url \
             ( ''
             , { ':action'        : 'search'
               , ':template'      : 'edit'
               , ':sort'          : 'date'
               , ':group'         : 'user'
               , ':filter'        : ','.join (request.filterspec.keys ())
               , ':startwith'     : '0'
               , ':error_message' : msg
               }
             )
         raise Redirect, url
     if 'user' in filterspec :
         self.user = filterspec ['user'][0]
     else :
         self.user = self.db.getuid ()
     vacation.create_daily_recs (self.db, self.user, start, end)
     self.db.commit ()
コード例 #2
0
def new_submission(db, cl, nodeid, new_values):
    """ Check that new leave submission is allowed and has sensible
        parameters
    """
    common.reject_attributes(_, new_values, 'approval_hr', 'comment_cancel')
    uid = db.getuid()
    st_subm = db.leave_status.lookup('submitted')
    if 'user' not in new_values:
        user = new_values['user'] = uid
    else:
        user = new_values['user']
    common.require_attributes \
        (_, cl, nodeid, new_values, 'first_day', 'last_day', 'user')
    first_day = new_values['first_day']
    last_day = new_values['last_day']
    fix_dates(new_values)
    if 'time_wp' not in new_values:
        wps = vacation.valid_leave_wps \
            ( db
            , user
            , last_day
            , [('-', 'project.is_vacation'), ('-', 'project.approval_hr')]
            )
        if wps:
            new_values['time_wp'] = wps[0]

    common.require_attributes(_, cl, nodeid, new_values, 'time_wp')
    if freeze.frozen(db, user, first_day):
        raise Reject(_("Frozen"))
    comment = new_values.get('comment')
    check_range(db, None, user, first_day, last_day)
    check_wp(db, new_values['time_wp'], user, first_day, last_day, comment)
    is_admin = (uid == '1')
    if 'status' in new_values and new_values[
            'status'] != st_subm and not is_admin:
        raise Reject(_('Initial status must be "submitted"'))
    if 'status' not in new_values:
        new_values['status'] = st_subm
    if (user != uid and
            not (is_admin or common.user_has_role(db, uid, 'HR-vacation'))):
        raise Reject \
            (_ ("Only special role may create submission for other user"))
    vacation.create_daily_recs(db, user, first_day, last_day)
    if vacation.leave_days(db, user, first_day, last_day) == 0:
        raise Reject(_("Vacation request for 0 days"))
    check_dr_status(db, user, first_day, last_day, 'open')
    check_dyn_user_params(db, user, first_day, last_day)
コード例 #3
0
def daily_recs(db, cl, nodeid, old_values):
    vs = cl.getnode(nodeid)
    vacation.create_daily_recs(db, vs.user, vs.first_day, vs.last_day)
コード例 #4
0
def check_submission(db, cl, nodeid, new_values):
    """ Check that changes to a leave submission are ok.
        We basically allow changes of first_day, last_day, and time_wp
        in status 'open'. The user must never change. The status
        transitions are bound to certain roles. Note that this auditor
        is called *after* it has been verified that a requested state
        change is at least possible (although we still have to check the
        role).
    """
    common.reject_attributes(_, new_values, 'user', 'approval_hr')
    old = cl.getnode(nodeid)
    uid = db.getuid()
    user = old.user
    old_status = db.leave_status.get(old.status, 'name')
    if old_status != 'accepted':
        common.reject_attributes(_, new_values, 'comment_cancel')
    new_status = db.leave_status.get \
        (new_values.get ('status', old.status), 'name')
    if old_status != 'open':
        common.reject_attributes \
            (_, new_values, 'first_day', 'last_day', 'time_wp', 'comment')
    fix_dates(new_values)
    first_day = new_values.get('first_day', cl.get(nodeid, 'first_day'))
    last_day = new_values.get('last_day', cl.get(nodeid, 'last_day'))
    if freeze.frozen(db, user, first_day):
        raise Reject(_("Frozen"))
    time_wp = new_values.get('time_wp', cl.get(nodeid, 'time_wp'))
    comment = new_values.get('comment', cl.get(nodeid, 'comment'))
    check_range(db, nodeid, user, first_day, last_day)
    check_wp(db, time_wp, user, first_day, last_day, comment)
    if old_status in ('open', 'submitted'):
        vacation.create_daily_recs(db, user, first_day, last_day)
    if 'first_day' in new_values or 'last_day' in new_values:
        if vacation.leave_days(db, user, first_day, last_day) == 0:
            raise Reject(_("Vacation request for 0 days"))
        check_dyn_user_params(db, user, first_day, last_day)
    if old_status in ('open', 'submitted'):
        check_dr_status(db, user, first_day, last_day, 'open')
    if old_status in ('accepted', 'cancel requested'):
        check_dr_status(db, user, first_day, last_day, 'leave')
    if old_status != new_status:
        if (old_status == 'accepted' and new_status == 'cancel requested'):
            common.require_attributes \
                (_, cl, nodeid, new_values, 'comment_cancel')
        # Allow special HR role to do any (possible) state changes
        # Except for approval of own records
        if (common.user_has_role(db, uid, 'HR-vacation') and
            (uid != user
             or new_status not in ('accepted', 'declined', 'cancelled'))):
            ok = True
        else:
            ok = False
            tp = db.time_project.getnode \
                (db.time_wp.get (old.time_wp, 'project'))
            if not ok and uid == user:
                if old_status == 'open' and new_status == 'submitted':
                    ok = True
                if (old_status == 'accepted'
                        and new_status == 'cancel requested'):
                    ok = True
                if old_status == 'submitted' and new_status == 'open':
                    ok = True
                if old_status == 'open' and new_status == 'cancelled':
                    ok = True
            elif not ok:
                clearer = common.tt_clearance_by(db, user)
                dyn = user_dynamic.get_user_dynamic(db, user, first_day)
                ctype = dyn.contract_type
                hr_only = vacation.need_hr_approval \
                    (db, tp, user, ctype, first_day, last_day, old_status)
                if (uid != user and
                    ((uid in clearer and not hr_only)
                     or common.user_has_role(db, uid, 'HR-leave-approval'))):
                    if (old_status == 'submitted'
                            and new_status in ('accepted', 'declined')):
                        ok = True
                    if (old_status == 'cancel requested'
                            and (new_status == 'cancelled'
                                 or new_status == 'accepted')):
                        ok = True
            if not ok:
                raise Reject(_("Permission denied"))