def validate_python(self, field_dict, state): resource = Resource.get(field_dict['resource_id']) if not resource.time_based: return if 'start' in field_dict and field_dict['start']: start = field_dict['start'] start_time = time(int(start['hour']), int(start['minute'])) date = dateconverter.to_python(field_dict['date']) start = datetime.combine(date, start_time) elif 'start_datetime' in field_dict and field_dict['start_datetime']: start = datetimeconverter.to_python(field_dict['start_datetime']) else: start = now(resource.place) if 'end' in field_dict and field_dict['end']: end = field_dict['end'] end_time = time(int(end['hour']), int(end['minute'])) date = dateconverter.to_python(field_dict['date']) end = datetime.combine(date, end_time) elif 'end_datetime' in field_dict and field_dict['end_datetime']: end = datetimeconverter.to_python(field_dict['end_datetime']) else: end = start errors = {} if end <= start: errors['end'] = _("The booking must end later than it starts!") errors['start'] = _("The booking must start before ending!") raise Invalid( 'That booking ends before starting', field_dict, state, error_dict=errors)
def user_loses_policyProxy(user, policyProxy): """call explicitly (better to user setter and getter on the model) *before* deleting/removing a user from a policyProxy """ access_policies = user.access_policies if not user.active: access_policies = user.disabled_policies if isinstance(policyProxy, Group) and user in policyProxy.users: #user should have already been removed print "lost " + policyProxy.group_name for pol in policyProxy.access_policies: access_policies.remove(int(pol.id)) if isinstance(policyProxy, PolicyGroup) and user in policyProxy.users: print "lost " + policyProxy.name for pol in policyProxy.access_policies: if int(pol.id) in access_policies: access_policies.remove(int(pol.id)) if isinstance(policyProxy, Resource) \ and policyProxy.type=='tariff' \ and get_tariff(policyProxy.place.id, user.id, now(policyProxy.place)) != policyProxy: print "lost " + policyProxy.name for pol in policyProxy.access_policies: if int(pol.id) in access_policies: access_policies.remove(int(pol.id)) if user.active: user.access_policies = access_policies else: user.disabled_policies = access_policies
def user_acquires_policyProxy(user, policyProxy): """called when adding a user to a group/role, policyGroup, tariff (save_tariffHistoryEdit) """ #get the policies associated with this policyProxy access_policies = user.access_policies if not user.active: access_policies = user.disabled_policies if isinstance(policyProxy, Group) and user in policyProxy.users: print "acquired " + policyProxy.group_name for pol in policyProxy.access_policies: if int(pol.id) not in access_policies: access_policies.append(int(pol.id)) elif isinstance(policyProxy, PolicyGroup) and user in policyProxy.users: print "acquired " + policyProxy.name for pol in policyProxy.access_policies: if int(pol.id) not in access_policies: access_policies.append(int(pol.id)) elif isinstance(policyProxy, Resource) \ and policyProxy.type=='tariff' \ and get_tariff(policyProxy.place.id, user.id, now(policyProxy.place)) == policyProxy: print "acquired " + policyProxy.name for pol in policyProxy.access_policies: if int(pol.id) not in access_policies: access_policies.append(int(pol.id)) if user.active: user.access_policies = access_policies else: user.disabled_policies = access_policies
def tariff_users(tariff): localtime = now(tariff.place) if isinstance(tariff, Resource) and tariff.type == 'tariff': return User.select(AND(RUsage.q.resourceID == tariff.id, RUsage.q.userID == User.q.id, RUsage.q.start <= localtime, RUsage.q.end_time >= localtime)) raise "input is not a tariff"
def validate_python(self, field_dict, state): resource = Resource.get(field_dict['resource_id']) if not resource.time_based: return if 'start' in field_dict and field_dict['start']: start = field_dict['start'] start_time = time(int(start['hour']), int(start['minute'])) date = dateconverter.to_python(field_dict['date']) start = datetime.combine(date, start_time) elif 'start_datetime' in field_dict and field_dict['start_datetime']: start = datetimeconverter.to_python(field_dict['start_datetime']) else: start = now(resource.place) if field_dict.get("tentative"): if (start - now()) < timedelta(2): errors = {} err = _("A tentative booking should be made at least %s hours in advance!") % bookinglib.t_booking_life_hrs errors['tentative'] = err errors['date'] = err raise Invalid(err, field_dict, state, error_dict=errors)
def validate_python(self, field_dict, state): from hubspace.controllers import unavailable_for_booking resource = Resource.get(field_dict['resource_id']) resourceid = resource.id if not resource.time_based: return if 'start' in field_dict: start = field_dict['start'] start_time = time(int(start['hour']), int(start['minute'])) date = dateconverter.to_python(field_dict['date']) start = datetime.combine(date, start_time) elif 'start_datetime' in field_dict: start = datetimeconverter.to_python(field_dict['start_datetime']) else: start = now(resource.place) if 'end' in field_dict: end = field_dict['end'] end_time = time(int(end['hour']), int(end['minute'])) date = dateconverter.to_python(field_dict['date']) end = datetime.combine(date, end_time) elif 'end_datetime' in field_dict: end = datetimeconverter.to_python(field_dict['end_datetime']) else: end = start + timedelta(minutes=15) errors = {} rusage = None if 'id' in field_dict: rusage = field_dict['id'] booking_conflicts = unavailable_for_booking(resourceid, start, end, rusage) dfp = datetimeconverter.from_python if booking_conflicts.count(): conflict = booking_conflicts[0] if resource == conflict.resource: errors['start'] = escape(resource.name) + " cannot be booked from " + dfp(start) + " to "+ dfp(end) + " since it is booked from " + dfp(conflict.start) + " to " + dfp(conflict.end_time) else: errors['start'] = escape(resource.name) + " cannot be booked from " + dfp(start) + " to "+ dfp(end) + " since it requires " + escape(conflict.resource.name)+ " which is booked from " + dfp(conflict.start) + " to " + dfp(conflict.end_time) raise Invalid('Booking Conflicts', field_dict, state, error_dict=errors)
def recalculate_tariff_accessPolicies(location=None): """call explicitly when the month changes. Assumes monthly tariffs. Executed every hour on turn of the month so that updates are done per location at midnight. """ if not location: raise ValueError("There should be a location") users = filter_members(location, "", "member_search", active_only=False, start=None, end=None, override_user=True) time_here = now(location) #time_here = dt(2009, 2, 1) # for testing new_month = time_here + timedelta(days=1) old_month = time_here - timedelta(days=27) model.hub.commit() model.hub.begin() for user in users: old_tariff = get_tariff(location.id, user.id, old_month) new_tariff = get_tariff(location.id, user.id, new_month) if old_tariff != new_tariff: user_acquires_policyProxy(user, new_tariff) user_loses_policyProxy(user, old_tariff) model.hub.commit() model.hub.begin() model.hub.commit()