def create_item(self, item): reservation = Reservation() reservation.resource_id = self.__resource_id reservation.reserver_email_address = item.reserver_email_address reservation.reserver_phone_number = item.reserver_phone_number reservation.reserver_name = item.reserver_name reservation.begin = item.begin reservation.end = item.end reservation._from_o365_sync = True reservation.set_state(Reservation.CONFIRMED, None) reservation.save() return reservation.id, reservation_change_key(item)
def save_reservation( data, hvara_reservations, user_objects_by_email, missing_users, catering_provider, ): if not data['resource']['object']: return origin_id = 'hvara:%s' % data['VarausId'] res = hvara_reservations.get(origin_id) try: res = Reservation.objects.get(origin_id=origin_id) except Reservation.DoesNotExist: res = Reservation(origin_id=origin_id) res.begin = local_tz.localize( datetime.strptime(data['AlkuAika'], "%Y-%m-%dT%H:%M:%S")) res.end = local_tz.localize( datetime.strptime(data['LoppuAika'], "%Y-%m-%dT%H:%M:%S")) res.event_subject = data['Tilaisuus'].strip() res.host_name = data['Isanta'].strip() res.created_at = local_tz.localize( datetime.strptime(data['Perustettu'], "%Y-%m-%dT%H:%M:%S")) res.modified_at = local_tz.localize( datetime.strptime(data['Muutettu'], "%Y-%m-%dT%H:%M:%S")) res.number_of_participants = int(data['OsallistujaLkm']) if res.number_of_participants < 0: res.number_of_participants = None res.event_description = data['Selite'] or '' if data['VarusteluSelite'] or data['equipment']: s = 'Varustelu:\n' items = [] if data['equipment']: items.append('\n'.join(['- ' + x for x in data['equipment']])) if data['VarusteluSelite']: items.append(data['VarusteluSelite']) s += '\n\n'.join(items) if res.event_description and not res.event_description.endswith('\n'): s = '\n' + s res.event_description += s res.participants = '\n'.join(data['attendees']) if data['OsallistujaSelite']: if res.participants: res.participants += '\n\n' res.participants += data['OsallistujaSelite'] res.comments = 'Siirretty vanhasta huonevarausjärjestelmästä' res.resource = data['resource']['object'] user = data['user'] if user is not None: res.reserver_name = user['Nimi'] email = user['Mail'].strip().lower() res.reserver_email_address = email res.reserver_phone_number = user['Puhelin'] if email not in user_objects_by_email: try: u_obj = User.objects.get(email=email) except User.DoesNotExist: print("%s does not exist" % email) u_obj = None user_objects_by_email[email] = u_obj res.user = user_objects_by_email[email] if not res.user: missing_users.setdefault(email, 0) missing_users[email] += 1 else: res.reserver_name = '' res.reserver_email_address = '' res.reserver_phone_number = '' res.user = None res._skip_notifications = True print(res) res.save() if data['catering'] or data['TarjoiluSelite']: order = CateringOrder(reservation=res, provider=catering_provider) invoicing_data = [data.get(f) for f in PAYER_FIELDS] order.invoicing_data = '\n'.join( [val.strip() for val in invoicing_data if val]) message_data = [] if data['catering']: message_data.append('\n'.join(data['catering'])) if data['TarjoiluSelite']: message_data.append(data['TarjoiluSelite'].strip()) order.message = '\n\n'.join(message_data) order.save()
def create(self, request): stack = request.data.pop('reservation_stack') if 'resource' in stack[0]: stack[0].pop('resource') if len(stack) > 100: return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Too many reservations at once.'), }, status=400) data = {**request.data} data.update({'user': request.user}) resource_id = data.get('resource') try: for key in stack: begin = key.get('begin') end = key.get('end') if begin is None or end is None: return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Begin or end time is missing.' ) }, status=400) reservations = [] for key in stack: begin = parse_datetime(key.get('begin')) end = parse_datetime(key.get('end')) try: resource = Resource.objects.get(id=resource_id) except: raise data['resource'] = resource res = Reservation(**data) res.begin = begin res.end = end if resource.validate_reservation_period(res, res.user): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Make sure reservation period is correct.' ) }, status=400) if resource.validate_max_reservations_per_user(res.user): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Too many reservations at once.' ) }, status=400) if resource.check_reservation_collision(begin, end, res): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Overlap with existing reservations.' ) }, status=400) reservations.append(res) reservation_dates_context = {'dates': []} """ {% if bulk_email_context is defined %} {% for date in bulk_email_context['dates'] %} Alku: {{ date.get('begin') }} Loppu {{ date.get('end') }} {% endfor %} {% endif %} """ for res in reservations: res.state = 'confirmed' if resource.validate_reservation_period(res, res.user): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Make sure reservation period is correct.' ) }, status=400) if resource.validate_max_reservations_per_user(res.user): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Too many reservations at once.' ) }, status=400) if resource.check_reservation_collision(begin, end, res): return JsonResponse( { 'status': 'false', 'recurring_validation_error': _('Reservation failed. Overlap with existing reservations.' ) }, status=400) res.save() reservation_dates_context['dates'].append({ 'begin': dateparser(reservations[0].begin, res.begin), 'end': dateparser(reservations[0].end, res.end) }) reservation_dates_context.update({ 'first_reservation': { 'begin': dateparser(reservations[0].begin, reservations[0].begin), 'end': dateparser(reservations[0].end, reservations[0].end) } }) reservation_dates_context.update({ 'last_reservation': { 'begin': dateparser(reservations[0].begin, reservations[len(reservations) - 1].begin), 'end': dateparser(reservations[0].end, reservations[len(reservations) - 1].end) } }) res = reservations[0] url = ''.join([ request.is_secure() and 'https' or 'http', get_current_site(request).domain, '/v1/', 'reservation/', str(res.id), '/' ]) ical_file = build_reservations_ical_file(reservations) attachment = ('reservation.ics', ical_file, 'text/calendar') res.send_reservation_mail( NotificationType.RESERVATION_BULK_CREATED, action_by_official=res.user.is_staff, attachments=[attachment], extra_context=reservation_dates_context) return JsonResponse(data={ **ReservationSerializer(context={ 'request': self.request if self.request else request }).to_representation(res) }, status=200) except Exception as ex: return JsonResponse( { 'status': 'false', 'recurring_validation_error': 'Reservation failed. Try again later.' }, status=500)
def save_reservation( data, hvara_reservations, user_objects_by_email, missing_users, catering_provider, ): if not data['resource']['object']: return origin_id = 'hvara:%s' % data['VarausId'] res = hvara_reservations.get(origin_id) try: res = Reservation.objects.get(origin_id=origin_id) except Reservation.DoesNotExist: res = Reservation(origin_id=origin_id) res.begin = local_tz.localize(datetime.strptime(data['AlkuAika'], "%Y-%m-%dT%H:%M:%S")) res.end = local_tz.localize(datetime.strptime(data['LoppuAika'], "%Y-%m-%dT%H:%M:%S")) res.event_subject = data['Tilaisuus'].strip() res.host_name = data['Isanta'].strip() res.created_at = local_tz.localize(datetime.strptime(data['Perustettu'], "%Y-%m-%dT%H:%M:%S")) res.modified_at = local_tz.localize(datetime.strptime(data['Muutettu'], "%Y-%m-%dT%H:%M:%S")) res.number_of_participants = int(data['OsallistujaLkm']) if res.number_of_participants < 0: res.number_of_participants = None res.event_description = data['Selite'] or '' if data['VarusteluSelite'] or data['equipment']: s = 'Varustelu:\n' items = [] if data['equipment']: items.append('\n'.join(['- ' + x for x in data['equipment']])) if data['VarusteluSelite']: items.append(data['VarusteluSelite']) s += '\n\n'.join(items) if res.event_description and not res.event_description.endswith('\n'): s = '\n' + s res.event_description += s res.participants = '\n'.join(data['attendees']) if data['OsallistujaSelite']: if res.participants: res.participants += '\n\n' res.participants += data['OsallistujaSelite'] res.comments = 'Siirretty vanhasta huonevarausjärjestelmästä' res.resource = data['resource']['object'] user = data['user'] if user is not None: res.reserver_name = user['Nimi'] email = user['Mail'].strip().lower() res.reserver_email_address = email res.reserver_phone_number = user['Puhelin'] if email not in user_objects_by_email: try: u_obj = User.objects.get(email=email) except User.DoesNotExist: print("%s does not exist" % email) u_obj = None user_objects_by_email[email] = u_obj res.user = user_objects_by_email[email] if not res.user: missing_users.setdefault(email, 0) missing_users[email] += 1 else: res.reserver_name = '' res.reserver_email_address = '' res.reserver_phone_number = '' res.user = None res._skip_notifications = True print(res) res.save() if data['catering'] or data['TarjoiluSelite']: order = CateringOrder(reservation=res, provider=catering_provider) invoicing_data = [data.get(f) for f in PAYER_FIELDS] order.invoicing_data = '\n'.join([val.strip() for val in invoicing_data if val]) message_data = [] if data['catering']: message_data.append('\n'.join(data['catering'])) if data['TarjoiluSelite']: message_data.append(data['TarjoiluSelite'].strip()) order.message = '\n\n'.join(message_data) order.save()