def check_for_retire_and_duration (db, cl, nodeid, old_values) : if cl.get (nodeid, 'duration') is None : cl.retire (nodeid) elif (common.changed_values (old_values, cl, nodeid) not in (['tr_duration'], []) ) : drid = cl.get (nodeid, 'daily_record') dr = db.daily_record.getnode (drid) user_dynamic.invalidate_tr_duration (db, dr.user, dr.date, dr.date)
def update_timerecs (db, time_record_id, set_it) : """ Update list of time_records with the given time_record_id if do_reset is specified, we *remove* the given id from the list, otherwise we *add* it. """ id = int (time_record_id) drec_id = db.time_record.get (time_record_id, 'daily_record') trecs_o = [int (i) for i in db.daily_record.get (drec_id, 'time_record')] trecs = dict ([(i, 1) for i in trecs_o]) if set_it : trecs [id] = 1 elif id in trecs : del trecs [id] trecs = trecs.keys () trecs.sort () if trecs != trecs_o : dr = db.daily_record.getnode (drec_id) db.daily_record.set \ ( drec_id , time_record = [str (i) for i in trecs] , tr_duration_ok = None ) user_dynamic.invalidate_tr_duration (db, dr.user, dr.date, dr.date)
def check_user_dynamic(db, cl, nodeid, new_values): old_ot = cl.get(nodeid, 'overtime_period') for i in 'user', : if i in new_values and cl.get(nodeid, i): raise Reject(_("%(attr)s may not be changed") % {'attr': _(i)}) common.require_attributes \ ( _, cl, nodeid, new_values , 'valid_from' , 'org_location' , 'department' ) user = new_values.get('user', cl.get(nodeid, 'user')) old_from = cl.get(nodeid, 'valid_from') val_from = new_values.get('valid_from', old_from) val_to = new_values.get('valid_to', cl.get(nodeid, 'valid_to')) olo = new_values.get('org_location', cl.get(nodeid, 'org_location')) dept = new_values.get('department', cl.get(nodeid, 'department')) # Note: The valid_to date is *not* part of the validity interval of # the user_dynamic record. So when checking for frozen status we # can allow exactly the valid_to date. otw = common.overtime_period_week(db) nvk = list(sorted(new_values.keys())) old_flexmax = cl.get(nodeid, 'max_flexitime') vac_all = ('vacation_day', 'vacation_month', 'vacation_yearly', 'vac_aliq') vac_aliq = cl.get(nodeid, 'vac_aliq') vac_fix = \ ( set (nvk) <= set (vac_all) and 'vac_aliq' not in nvk or vac_aliq is None and db.getuid () == '1' ) flexi_fix = \ new_values.keys () == ['max_flexitime'] and old_flexmax is None if (freeze.frozen(db, user, old_from) and (new_values.keys() != ['valid_to'] or not val_to or freeze.frozen(db, user, val_to)) and (db.getuid() != '1' or old_ot or not otw or new_values != dict(overtime_period=otw.id)) and (db.getuid() != '1' or not flexi_fix) and not vac_fix): raise Reject(_("Frozen: %(old_from)s") % locals()) last = user_dynamic.last_user_dynamic(db, user) if (('org_location' in new_values or 'department' in new_values) and (not val_to or last.id == nodeid or last.valid_from < val_from)): update_user_olo_dept(db, user, olo, dept) if 'valid_from' in new_values or 'valid_to' in new_values: new_values ['valid_from'], new_values ['valid_to'] = \ check_ranges (cl, nodeid, user, val_from, val_to) val_from = new_values['valid_from'] val_to = new_values['valid_to'] if not vac_fix and not flexi_fix: check_overtime_parameters(db, cl, nodeid, new_values) check_vacation(db, cl, nodeid, 'vacation_yearly', new_values) if not freeze.frozen(db, user, old_from): user_dynamic.invalidate_tr_duration(db, user, val_from, val_to) else: old_to = cl.get(nodeid, 'valid_to') use_to = val_to if old_to: if val_to: use_to = min(old_to, val_to) else: use_to = old_to user_dynamic.invalidate_tr_duration(db, user, use_to, None) check_weekly_hours(db, cl, nodeid, new_values)