Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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"
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
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()