def create(self, validated_data): item_price_overrides_data = validated_data.pop('subeventitem_set') if 'subeventitem_set' in validated_data else {} variation_price_overrides_data = validated_data.pop('subeventitemvariation_set') if 'subeventitemvariation_set' in validated_data else {} meta_data = validated_data.pop('meta_data', None) seat_category_mapping = validated_data.pop('seat_category_mapping', None) subevent = super().create(validated_data) for item_price_override_data in item_price_overrides_data: SubEventItem.objects.create(subevent=subevent, **item_price_override_data) for variation_price_override_data in variation_price_overrides_data: SubEventItemVariation.objects.create(subevent=subevent, **variation_price_override_data) # Meta data if meta_data is not None: for key, value in meta_data.items(): if key not in self.ignored_meta_properties: subevent.meta_values.create( property=self.meta_properties.get(key), value=value ) # Seats if subevent.seating_plan: if seat_category_mapping is not None: for key, value in seat_category_mapping.items(): self.context['request'].event.seat_category_mappings.create( product=value, layout_category=key, subevent=subevent ) generate_seats(self.context['request'].event, subevent, subevent.seating_plan, { m.layout_category: m.product for m in self.context['request'].event.seat_category_mappings.select_related('product').filter(subevent=subevent) }) return subevent
def create(self, validated_data): meta_data = validated_data.pop('meta_data', None) item_meta_properties = validated_data.pop('item_meta_properties', None) validated_data.pop('seat_category_mapping', None) plugins = validated_data.pop( 'plugins', settings.PRETIX_PLUGINS_DEFAULT.split(',')) tz = validated_data.pop('timezone', None) event = super().create(validated_data) if tz: event.settings.timezone = tz # Meta data if meta_data is not None: for key, value in meta_data.items(): event.meta_values.create( property=self.meta_properties.get(key), value=value) # Item Meta properties if item_meta_properties is not None: for key, value in item_meta_properties.items(): event.item_meta_properties.create(name=key, default=value, event=event) # Seats if event.seating_plan: generate_seats(event, None, event.seating_plan, {}) # Plugins if plugins is not None: event.set_active_plugins(plugins) event.save(update_fields=['plugins']) return event
def update(self, instance, validated_data): meta_data = validated_data.pop('meta_data', None) plugins = validated_data.pop('plugins', None) seat_category_mapping = validated_data.pop('seat_category_mapping', None) event = super().update(instance, validated_data) # Meta data if meta_data is not None: current = { mv.property: mv for mv in event.meta_values.select_related('property') } for key, value in meta_data.items(): prop = self.meta_properties.get(key) if prop in current: current[prop].value = value current[prop].save() else: event.meta_values.create( property=self.meta_properties.get(key), value=value) for prop, current_object in current.items(): if prop.name not in meta_data: current_object.delete() # Seats if seat_category_mapping is not None or ( 'seating_plan' in validated_data and validated_data['seating_plan'] is None): current_mappings = { m.layout_category: m for m in event.seat_category_mappings.filter(subevent=None) } if not event.seating_plan: seat_category_mapping = {} for key, value in seat_category_mapping.items(): if key in current_mappings: m = current_mappings.pop(key) m.product = value m.save() else: event.seat_category_mappings.create(product=value, layout_category=key) for m in current_mappings.values(): m.delete() if 'seating_plan' in validated_data or seat_category_mapping is not None: generate_seats( event, None, event.seating_plan, { m.layout_category: m.product for m in event.seat_category_mappings.select_related( 'product').filter(subevent=None) }) # Plugins if plugins is not None: event.set_active_plugins(plugins) event.save() return event
def update(self, instance, validated_data): item_price_overrides_data = validated_data.pop('subeventitem_set', None) variation_price_overrides_data = validated_data.pop('subeventitemvariation_set', None) meta_data = validated_data.pop('meta_data', None) seat_category_mapping = validated_data.pop('seat_category_mapping', None) subevent = super().update(instance, validated_data) if item_price_overrides_data is not None: existing_item_overrides = {item.item: item.id for item in SubEventItem.objects.filter(subevent=subevent)} for item_price_override_data in item_price_overrides_data: id = existing_item_overrides.pop(item_price_override_data['item'], None) SubEventItem(id=id, subevent=subevent, **item_price_override_data).save() SubEventItem.objects.filter(id__in=existing_item_overrides.values()).delete() if variation_price_overrides_data is not None: existing_variation_overrides = {item.variation: item.id for item in SubEventItemVariation.objects.filter(subevent=subevent)} for variation_price_override_data in variation_price_overrides_data: id = existing_variation_overrides.pop(variation_price_override_data['variation'], None) SubEventItemVariation(id=id, subevent=subevent, **variation_price_override_data).save() SubEventItemVariation.objects.filter(id__in=existing_variation_overrides.values()).delete() # Meta data if meta_data is not None: current = {mv.property: mv for mv in subevent.meta_values.select_related('property')} for key, value in meta_data.items(): if key not in self.ignored_meta_properties: prop = self.meta_properties.get(key) if prop in current: current[prop].value = value current[prop].save() else: subevent.meta_values.create( property=self.meta_properties.get(key), value=value ) for prop, current_object in current.items(): if prop.name not in self.ignored_meta_properties: if prop.name not in meta_data: current_object.delete() # Seats if seat_category_mapping is not None or ('seating_plan' in validated_data and validated_data['seating_plan'] is None): current_mappings = { m.layout_category: m for m in self.context['request'].event.seat_category_mappings.filter(subevent=subevent) } if not subevent.seating_plan: seat_category_mapping = {} for key, value in seat_category_mapping.items(): if key in current_mappings: m = current_mappings.pop(key) m.product = value m.save() else: self.context['request'].event.seat_category_mappings.create( product=value, layout_category=key, subevent=subevent ) for m in current_mappings.values(): m.delete() if 'seating_plan' in validated_data or seat_category_mapping is not None: generate_seats(self.context['request'].event, subevent, subevent.seating_plan, { m.layout_category: m.product for m in self.context['request'].event.seat_category_mappings.select_related('product').filter(subevent=subevent) }) return subevent
def update(self, instance, validated_data): meta_data = validated_data.pop('meta_data', None) item_meta_properties = validated_data.pop('item_meta_properties', None) plugins = validated_data.pop('plugins', None) seat_category_mapping = validated_data.pop('seat_category_mapping', None) tz = validated_data.pop('timezone', None) event = super().update(instance, validated_data) if tz: event.settings.timezone = tz # Meta data if meta_data is not None: current = {mv.property: mv for mv in event.meta_values.select_related('property')} for key, value in meta_data.items(): if key not in self.ignored_meta_properties: prop = self.meta_properties.get(key) if prop in current: current[prop].value = value current[prop].save() else: event.meta_values.create( property=self.meta_properties.get(key), value=value ) for prop, current_object in current.items(): if prop.name not in self.ignored_meta_properties: if prop.name not in meta_data: current_object.delete() # Item Meta properties if item_meta_properties is not None: current = [imp for imp in event.item_meta_properties.all()] for key, value in item_meta_properties.items(): prop = self.item_meta_props.get(key) if prop in current: prop.default = value prop.save() else: prop = event.item_meta_properties.create( name=key, default=value, event=event ) current.append(prop) for prop in current: if prop.name not in list(item_meta_properties.keys()): prop.delete() # Seats if seat_category_mapping is not None or ('seating_plan' in validated_data and validated_data['seating_plan'] is None): current_mappings = { m.layout_category: m for m in event.seat_category_mappings.filter(subevent=None) } if not event.seating_plan: seat_category_mapping = {} for key, value in seat_category_mapping.items(): if key in current_mappings: m = current_mappings.pop(key) m.product = value m.save() else: event.seat_category_mappings.create(product=value, layout_category=key) for m in current_mappings.values(): m.delete() if 'seating_plan' in validated_data or seat_category_mapping is not None: generate_seats(event, None, event.seating_plan, { m.layout_category: m.product for m in event.seat_category_mappings.select_related('product').filter(subevent=None) }) # Plugins if plugins is not None: event.set_active_plugins(plugins) event.save() return event