From dc68f7ed7f3c9ff8f903bfb234f5a8eba106df47 Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sat, 7 Dec 2024 19:52:32 -0600 Subject: [PATCH 01/17] Added Even_Context to classify event related models in contexts defined in DDD --- app/api/access_codes.py | 2 +- app/api/admin_sales/discounted.py | 2 +- app/api/admin_sales/events.py | 2 +- app/api/admin_sales/fees.py | 2 +- app/api/admin_sales/locations.py | 2 +- app/api/admin_sales/organizer.py | 2 +- app/api/admin_statistics_api/groups.py | 2 +- app/api/admin_statistics_api/sessions.py | 2 +- app/api/badge_forms.py | 2 +- app/api/chat/rocket_chat.py | 6 +++--- app/api/custom/calendars.py | 2 +- app/api/custom/check_in_stats.py | 8 ++++---- app/api/custom/events.py | 6 +++--- app/api/custom/groups.py | 2 +- app/api/custom_forms.py | 2 +- app/api/custom_placeholders.py | 2 +- app/api/data_layers/EventCopyLayer.py | 8 ++++---- app/api/discount_codes.py | 2 +- app/api/event_copy.py | 10 +++++----- app/api/event_copyright.py | 4 ++-- app/api/event_locations.py | 4 ++-- app/api/event_statistics.py | 2 +- app/api/event_sub_topics.py | 6 +++--- app/api/event_topics.py | 6 +++--- app/api/event_types.py | 4 ++-- app/api/events.py | 18 +++++++++--------- app/api/exhibitors.py | 2 +- app/api/feedbacks.py | 6 +++--- app/api/groups.py | 2 +- app/api/helpers/ICalExporter.py | 2 +- app/api/helpers/calendar/ical.py | 2 +- app/api/helpers/export_helpers.py | 10 +++++----- app/api/helpers/import_helpers.py | 10 +++++----- app/api/helpers/mail.py | 2 +- app/api/helpers/pentabarfxml.py | 6 +++--- app/api/helpers/permission_manager.py | 4 ++-- app/api/helpers/permissions.py | 2 +- app/api/helpers/query.py | 2 +- app/api/helpers/scheduled_jobs.py | 4 ++-- app/api/helpers/tasks.py | 6 +++--- app/api/helpers/user_check_in.py | 4 ++-- app/api/helpers/xcal.py | 4 ++-- app/api/microlocations.py | 4 ++-- app/api/order_statistics/events.py | 2 +- app/api/role_invites.py | 2 +- .../schema/admin_statistics_schema/events.py | 2 +- app/api/schema/event_statistics.py | 4 ++-- app/api/schema/events.py | 2 +- app/api/schema/sessions.py | 2 +- app/api/schema/speakers_calls.py | 2 +- app/api/session_types.py | 4 ++-- app/api/sessions.py | 6 +++--- app/api/speaker_invites.py | 4 ++-- app/api/speakers.py | 4 ++-- app/api/speakers_calls.py | 4 ++-- app/api/sponsors.py | 2 +- app/api/station.py | 6 +++--- app/api/station_store_paxs.py | 4 ++-- app/api/stripe_authorization.py | 2 +- app/api/tags.py | 4 ++-- app/api/tax.py | 4 ++-- app/api/tickets.py | 2 +- app/api/tracks.py | 2 +- app/api/translation_channels.py | 4 ++-- app/api/user_favourite_sessions.py | 4 ++-- app/api/users.py | 8 ++++---- app/api/video_channel.py | 4 ++-- app/api/video_channel_stream.py | 4 ++-- app/api/video_recordings.py | 4 ++-- app/api/video_stream.py | 12 ++++++------ app/api/video_stream_moderators.py | 4 ++-- app/models/{ => Event_Context}/event.py | 6 +++--- .../{ => Event_Context}/event_copyright.py | 0 .../{ => Event_Context}/event_location.py | 0 app/models/{ => Event_Context}/event_orga.py | 0 .../{ => Event_Context}/event_sub_topic.py | 0 app/models/{ => Event_Context}/event_topic.py | 0 app/models/{ => Event_Context}/event_type.py | 0 app/models/{ => Event_Context}/feedback.py | 0 .../{ => Event_Context}/microlocation.py | 0 app/models/{ => Event_Context}/session.py | 2 +- app/models/{ => Event_Context}/session_type.py | 0 .../{ => Event_Context}/speakers_call.py | 0 app/models/{ => Event_Context}/sponsor.py | 0 app/models/{ => Event_Context}/station.py | 0 app/models/{ => Event_Context}/tag.py | 0 app/models/{ => Event_Context}/tax.py | 0 .../{ => Event_Context}/video_channel.py | 0 .../{ => Event_Context}/video_recording.py | 0 app/models/{ => Event_Context}/video_stream.py | 4 ++-- .../video_stream_moderator.py | 0 app/models/role_invite.py | 2 +- app/models/speaker_invite.py | 2 +- app/models/translation_channels.py | 2 +- app/models/user.py | 4 ++-- tests/all/integration/api/helpers/test_db.py | 2 +- .../all/integration/api/helpers/test_query.py | 2 +- .../api/session/test_session_forms_api.py | 2 +- .../video_stream/test_video_stream_edit_api.py | 2 +- tests/factories/event.py | 2 +- tests/factories/event_copyright.py | 2 +- tests/factories/event_location.py | 2 +- tests/factories/event_sub_topic.py | 2 +- tests/factories/event_topic.py | 2 +- tests/factories/event_type.py | 2 +- tests/factories/feedback.py | 2 +- tests/factories/microlocation.py | 2 +- tests/factories/session.py | 2 +- tests/factories/session_type.py | 2 +- tests/factories/speakers_call.py | 2 +- tests/factories/sponsor.py | 2 +- tests/factories/station.py | 2 +- tests/factories/tax.py | 2 +- tests/factories/video_channel.py | 2 +- tests/factories/video_stream.py | 2 +- 115 files changed, 176 insertions(+), 176 deletions(-) rename app/models/{ => Event_Context}/event.py (99%) rename app/models/{ => Event_Context}/event_copyright.py (100%) rename app/models/{ => Event_Context}/event_location.py (100%) rename app/models/{ => Event_Context}/event_orga.py (100%) rename app/models/{ => Event_Context}/event_sub_topic.py (100%) rename app/models/{ => Event_Context}/event_topic.py (100%) rename app/models/{ => Event_Context}/event_type.py (100%) rename app/models/{ => Event_Context}/feedback.py (100%) rename app/models/{ => Event_Context}/microlocation.py (100%) rename app/models/{ => Event_Context}/session.py (98%) rename app/models/{ => Event_Context}/session_type.py (100%) rename app/models/{ => Event_Context}/speakers_call.py (100%) rename app/models/{ => Event_Context}/sponsor.py (100%) rename app/models/{ => Event_Context}/station.py (100%) rename app/models/{ => Event_Context}/tag.py (100%) rename app/models/{ => Event_Context}/tax.py (100%) rename app/models/{ => Event_Context}/video_channel.py (100%) rename app/models/{ => Event_Context}/video_recording.py (100%) rename app/models/{ => Event_Context}/video_stream.py (97%) rename app/models/{ => Event_Context}/video_stream_moderator.py (100%) diff --git a/app/api/access_codes.py b/app/api/access_codes.py index 65ab6b44ce..f74b0ebb21 100644 --- a/app/api/access_codes.py +++ b/app/api/access_codes.py @@ -12,7 +12,7 @@ from app.api.schema.access_codes import AccessCodeSchema from app.models import db from app.models.access_code import AccessCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.ticket import Ticket from app.models.user import User diff --git a/app/api/admin_sales/discounted.py b/app/api/admin_sales/discounted.py index 6d9bb55c5b..5dcb9fc283 100644 --- a/app/api/admin_sales/discounted.py +++ b/app/api/admin_sales/discounted.py @@ -7,7 +7,7 @@ from app.api.helpers.utilities import dasherize from app.models import db from app.models.discount_code import DiscountCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order, OrderTicket from app.models.user import User diff --git a/app/api/admin_sales/events.py b/app/api/admin_sales/events.py index 23bb34d819..19511ba2dd 100644 --- a/app/api/admin_sales/events.py +++ b/app/api/admin_sales/events.py @@ -7,7 +7,7 @@ from app.api.helpers.db import save_bulk_to_db from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event class AdminSalesByEventsSchema(Schema): diff --git a/app/api/admin_sales/fees.py b/app/api/admin_sales/fees.py index f6d0d5ab31..04026d0a20 100644 --- a/app/api/admin_sales/fees.py +++ b/app/api/admin_sales/fees.py @@ -5,7 +5,7 @@ from app.api.bootstrap import api from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event class AdminSalesFeesSchema(Schema): diff --git a/app/api/admin_sales/locations.py b/app/api/admin_sales/locations.py index d80caf2ad2..401f3c50dc 100644 --- a/app/api/admin_sales/locations.py +++ b/app/api/admin_sales/locations.py @@ -6,7 +6,7 @@ from app.api.bootstrap import api from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order, OrderTicket diff --git a/app/api/admin_sales/organizer.py b/app/api/admin_sales/organizer.py index 007c43f3ef..8f4983e847 100644 --- a/app/api/admin_sales/organizer.py +++ b/app/api/admin_sales/organizer.py @@ -7,7 +7,7 @@ from app.api.bootstrap import api from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order, OrderTicket from app.models.role import Role from app.models.user import User diff --git a/app/api/admin_statistics_api/groups.py b/app/api/admin_statistics_api/groups.py index 74b41c91b0..59d24b3107 100644 --- a/app/api/admin_statistics_api/groups.py +++ b/app/api/admin_statistics_api/groups.py @@ -6,7 +6,7 @@ from app.api.data_layers.NoModelLayer import NoModelLayer from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.group import Group from app.models.user_follow_group import UserFollowGroup diff --git a/app/api/admin_statistics_api/sessions.py b/app/api/admin_statistics_api/sessions.py index b6902f3163..ebb239f7ad 100644 --- a/app/api/admin_statistics_api/sessions.py +++ b/app/api/admin_statistics_api/sessions.py @@ -7,7 +7,7 @@ from app.api.helpers.db import get_count from app.api.helpers.utilities import dasherize from app.models import db -from app.models.session import Session +from app.models.Event_Context.session import Session class AdminStatisticsSessionSchema(Schema): diff --git a/app/api/badge_forms.py b/app/api/badge_forms.py index 50178a22eb..ea1a5ac5e9 100644 --- a/app/api/badge_forms.py +++ b/app/api/badge_forms.py @@ -12,7 +12,7 @@ from app.models import db from app.models.badge_field_form import BadgeFieldForms from app.models.badge_form import BadgeForms -from app.models.event import Event +from app.models.Event_Context.event import Event class BadgeFormList(ResourceList): diff --git a/app/api/chat/rocket_chat.py b/app/api/chat/rocket_chat.py index fdb3ea5885..07e613c2bf 100644 --- a/app/api/chat/rocket_chat.py +++ b/app/api/chat/rocket_chat.py @@ -8,10 +8,10 @@ from app.api.helpers.db import get_new_identifier, get_or_create from app.models import db -from app.models.event import Event -from app.models.microlocation import Microlocation +from app.models.Event_Context.event import Event +from app.models.Event_Context.microlocation import Microlocation from app.models.user import User -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_stream import VideoStream from app.settings import get_settings logger = logging.getLogger(__name__) diff --git a/app/api/custom/calendars.py b/app/api/custom/calendars.py index 2d74a8e72c..4064db2e13 100644 --- a/app/api/custom/calendars.py +++ b/app/api/custom/calendars.py @@ -5,7 +5,7 @@ from app.api.helpers.calendar.ical import to_ical from app.api.helpers.permissions import to_event_id -from app.models.event import Event +from app.models.Event_Context.event import Event calendar_routes = Blueprint('calendars', __name__, url_prefix='/v1/events') diff --git a/app/api/custom/check_in_stats.py b/app/api/custom/check_in_stats.py index 27e84b1149..c20781f591 100644 --- a/app/api/custom/check_in_stats.py +++ b/app/api/custom/check_in_stats.py @@ -6,10 +6,10 @@ from app.api.helpers.permissions import jwt_required from app.api.helpers.static import STATION_TYPE from app.models import db -from app.models.event import Event -from app.models.session import Session -from app.models.session_type import SessionType -from app.models.station import Station +from app.models.Event_Context.event import Event +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType +from app.models.Event_Context.station import Station from app.models.station_store_pax import StationStorePax from app.models.ticket_holder import TicketHolder from app.models.track import Track diff --git a/app/api/custom/events.py b/app/api/custom/events.py index 12ed181b23..ce8fc444af 100644 --- a/app/api/custom/events.py +++ b/app/api/custom/events.py @@ -13,11 +13,11 @@ from app.api.schema.virtual_check_in import VirtualCheckInSchema from app.models import db from app.models.discount_code import DiscountCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.exhibitor import Exhibitor -from app.models.microlocation import Microlocation +from app.models.Event_Context.microlocation import Microlocation from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.ticket_holder import TicketHolder diff --git a/app/api/custom/groups.py b/app/api/custom/groups.py index 0b9e386e04..75fe15c255 100644 --- a/app/api/custom/groups.py +++ b/app/api/custom/groups.py @@ -10,7 +10,7 @@ from app.api.helpers.permissions import jwt_required, to_event_id from app.api.helpers.system_mails import MAILS, MailType from app.api.helpers.utilities import strip_tags -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.group import Group from app.models.role import Role from app.models.user_follow_group import UserFollowGroup diff --git a/app/api/custom_forms.py b/app/api/custom_forms.py index e182b109aa..b98849d351 100644 --- a/app/api/custom_forms.py +++ b/app/api/custom_forms.py @@ -12,7 +12,7 @@ from app.models import db from app.models.custom_form import CUSTOM_FORM_IDENTIFIER_NAME_MAP, CustomForms from app.models.custom_form_translate import CustomFormTranslates -from app.models.event import Event +from app.models.Event_Context.event import Event class CustomFormListPost(ResourceList): diff --git a/app/api/custom_placeholders.py b/app/api/custom_placeholders.py index b7eb0ab314..3208f2527c 100644 --- a/app/api/custom_placeholders.py +++ b/app/api/custom_placeholders.py @@ -6,7 +6,7 @@ from app.api.schema.custom_placeholders import CustomPlaceholderSchema from app.models import db from app.models.custom_placeholder import CustomPlaceholder -from app.models.event_sub_topic import EventSubTopic +from app.models.Event_Context.event_sub_topic import EventSubTopic class CustomPlaceholderList(ResourceList): diff --git a/app/api/data_layers/EventCopyLayer.py b/app/api/data_layers/EventCopyLayer.py index 8ecf027f3d..472b2a6597 100644 --- a/app/api/data_layers/EventCopyLayer.py +++ b/app/api/data_layers/EventCopyLayer.py @@ -8,11 +8,11 @@ from app.models import db from app.models.custom_form import CustomForms from app.models.discount_code import DiscountCode -from app.models.event import Event, get_new_event_identifier -from app.models.microlocation import Microlocation +from app.models.Event_Context.event import Event, get_new_event_identifier +from app.models.Event_Context.microlocation import Microlocation from app.models.social_link import SocialLink -from app.models.speakers_call import SpeakersCall -from app.models.sponsor import Sponsor +from app.models.Event_Context.speakers_call import SpeakersCall +from app.models.Event_Context.sponsor import Sponsor from app.models.ticket import Ticket from app.models.track import Track diff --git a/app/api/discount_codes.py b/app/api/discount_codes.py index cff1d1bc3c..0fbb4f32d3 100644 --- a/app/api/discount_codes.py +++ b/app/api/discount_codes.py @@ -23,7 +23,7 @@ ) from app.models import db from app.models.discount_code import DiscountCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.event_invoice import EventInvoice from app.models.ticket import Ticket from app.models.user import User diff --git a/app/api/event_copy.py b/app/api/event_copy.py index 7a6ff3b448..1e91ca3634 100644 --- a/app/api/event_copy.py +++ b/app/api/event_copy.py @@ -6,12 +6,12 @@ from app.models import db from app.models.custom_form import CustomForms from app.models.discount_code import DiscountCode -from app.models.event import Event, get_new_event_identifier -from app.models.microlocation import Microlocation +from app.models.Event_Context.event import Event, get_new_event_identifier +from app.models.Event_Context.microlocation import Microlocation from app.models.social_link import SocialLink -from app.models.speakers_call import SpeakersCall -from app.models.sponsor import Sponsor -from app.models.tax import Tax +from app.models.Event_Context.speakers_call import SpeakersCall +from app.models.Event_Context.sponsor import Sponsor +from app.models.Event_Context.tax import Tax from app.models.ticket import Ticket from app.models.track import Track from app.models.users_events_role import UsersEventsRoles diff --git a/app/api/event_copyright.py b/app/api/event_copyright.py index e66760df25..7b3e0d44e8 100644 --- a/app/api/event_copyright.py +++ b/app/api/event_copyright.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.event_copyright import EventCopyrightSchema from app.models import db -from app.models.event import Event -from app.models.event_copyright import EventCopyright +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_copyright import EventCopyright class EventCopyrightListPost(ResourceList): diff --git a/app/api/event_locations.py b/app/api/event_locations.py index 745589b1b2..46976fd825 100644 --- a/app/api/event_locations.py +++ b/app/api/event_locations.py @@ -7,8 +7,8 @@ from app.api.bootstrap import api from app.api.schema.event_locations import EventLocationSchema from app.models import db -from app.models.event import Event -from app.models.event_location import EventLocation +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_location import EventLocation class EventLocationList(ResourceList): diff --git a/app/api/event_statistics.py b/app/api/event_statistics.py index e58a0946ee..701ac95731 100644 --- a/app/api/event_statistics.py +++ b/app/api/event_statistics.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.event_statistics import EventStatisticsGeneralSchema from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event class EventStatisticsGeneralDetail(ResourceDetail): diff --git a/app/api/event_sub_topics.py b/app/api/event_sub_topics.py index a26007214f..f76d5246fd 100644 --- a/app/api/event_sub_topics.py +++ b/app/api/event_sub_topics.py @@ -8,9 +8,9 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.event_sub_topics import EventSubTopicSchema from app.models import db -from app.models.event import Event -from app.models.event_sub_topic import EventSubTopic -from app.models.event_topic import EventTopic +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_sub_topic import EventSubTopic +from app.models.Event_Context.event_topic import EventTopic class EventSubTopicListPost(ResourceList): diff --git a/app/api/event_topics.py b/app/api/event_topics.py index ab19de24e2..7e255b9d8b 100644 --- a/app/api/event_topics.py +++ b/app/api/event_topics.py @@ -8,9 +8,9 @@ from app.api.helpers.files import create_system_image from app.api.schema.event_topics import EventTopicSchema from app.models import db -from app.models.event import Event -from app.models.event_sub_topic import EventSubTopic -from app.models.event_topic import EventTopic +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_sub_topic import EventSubTopic +from app.models.Event_Context.event_topic import EventTopic class EventTopicList(ResourceList): diff --git a/app/api/event_types.py b/app/api/event_types.py index 871499a590..958860ccd1 100644 --- a/app/api/event_types.py +++ b/app/api/event_types.py @@ -4,8 +4,8 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.event_types import EventTypeSchema from app.models import db -from app.models.event import Event -from app.models.event_type import EventType +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_type import EventType class EventTypeList(ResourceList): diff --git a/app/api/events.py b/app/api/events.py index 7c463dab64..cb2524bb7f 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -39,27 +39,27 @@ from app.models.custom_form import CustomForms from app.models.discount_code import DiscountCode from app.models.email_notification import EmailNotification -from app.models.event import Event -from app.models.event_copyright import EventCopyright +from app.models.Event_Context.event import Event +from app.models.Event_Context.event_copyright import EventCopyright from app.models.event_invoice import EventInvoice from app.models.exhibitor import Exhibitor from app.models.faq import Faq from app.models.faq_type import FaqType -from app.models.feedback import Feedback +from app.models.Event_Context.feedback import Feedback from app.models.group import Group -from app.models.microlocation import Microlocation +from app.models.Event_Context.microlocation import Microlocation from app.models.order import Order from app.models.role import Role from app.models.role_invite import RoleInvite -from app.models.session import Session -from app.models.session_type import SessionType +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType from app.models.social_link import SocialLink from app.models.speaker import Speaker from app.models.speaker_invite import SpeakerInvite -from app.models.speakers_call import SpeakersCall -from app.models.sponsor import Sponsor +from app.models.Event_Context.speakers_call import SpeakersCall +from app.models.Event_Context.sponsor import Sponsor from app.models.stripe_authorization import StripeAuthorization -from app.models.tax import Tax +from app.models.Event_Context.tax import Tax from app.models.ticket import Ticket, TicketTag from app.models.ticket_holder import TicketHolder from app.models.track import Track diff --git a/app/api/exhibitors.py b/app/api/exhibitors.py index 9d4e73ca25..ec006e5887 100644 --- a/app/api/exhibitors.py +++ b/app/api/exhibitors.py @@ -9,7 +9,7 @@ from app.api.schema.exhibitors import ExhibitorSchema from app.models import db from app.models.exhibitor import Exhibitor -from app.models.session import Session +from app.models.Event_Context.session import Session class ExhibitorListPost(ResourceList): diff --git a/app/api/feedbacks.py b/app/api/feedbacks.py index 80cba026b0..c3193e7d50 100644 --- a/app/api/feedbacks.py +++ b/app/api/feedbacks.py @@ -11,9 +11,9 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.feedbacks import FeedbackSchema from app.models import db -from app.models.event import Event -from app.models.feedback import Feedback -from app.models.session import Session +from app.models.Event_Context.event import Event +from app.models.Event_Context.feedback import Feedback +from app.models.Event_Context.session import Session from app.models.user import User diff --git a/app/api/groups.py b/app/api/groups.py index 62163c9601..2c4c022e90 100644 --- a/app/api/groups.py +++ b/app/api/groups.py @@ -11,7 +11,7 @@ # models from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.group import Group from app.models.role import Role from app.models.user import User diff --git a/app/api/helpers/ICalExporter.py b/app/api/helpers/ICalExporter.py index c0c2e59d81..0f87ac0060 100644 --- a/app/api/helpers/ICalExporter.py +++ b/app/api/helpers/ICalExporter.py @@ -1,5 +1,5 @@ from app.api.helpers.calendar.ical import to_ical -from app.models.event import Event +from app.models.Event_Context.event import Event class ICalExporter: diff --git a/app/api/helpers/calendar/ical.py b/app/api/helpers/calendar/ical.py index fd2be132fb..5a65419c7a 100644 --- a/app/api/helpers/calendar/ical.py +++ b/app/api/helpers/calendar/ical.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import joinedload from app.api.helpers.utilities import remove_html_tags -from app.models.session import Session +from app.models.Event_Context.session import Session def to_ical(event, include_sessions=False, my_schedule=False, user_id=None): diff --git a/app/api/helpers/export_helpers.py b/app/api/helpers/export_helpers.py index 620a1b3cf6..2d5cb899ec 100644 --- a/app/api/helpers/export_helpers.py +++ b/app/api/helpers/export_helpers.py @@ -16,13 +16,13 @@ from app.api.helpers.utilities import get_filename_from_cd, is_downloadable from app.models import db from app.models.custom_form import CustomForms -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.export_job import ExportJob -from app.models.microlocation import Microlocation -from app.models.session import Session -from app.models.session_type import SessionType +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType from app.models.speaker import Speaker -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track # order of keys in export json diff --git a/app/api/helpers/import_helpers.py b/app/api/helpers/import_helpers.py index 9ea0d55ad5..ab455c1c0f 100644 --- a/app/api/helpers/import_helpers.py +++ b/app/api/helpers/import_helpers.py @@ -17,15 +17,15 @@ from app.api.helpers.utilities import is_downloadable, update_state, write_file from app.models import db from app.models.custom_form import CustomForms -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.import_job import ImportJob -from app.models.microlocation import Microlocation +from app.models.Event_Context.microlocation import Microlocation from app.models.role import Role -from app.models.session import Session -from app.models.session_type import SessionType +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType from app.models.social_link import SocialLink from app.models.speaker import Speaker -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track from app.models.user import User from app.models.users_events_role import UsersEventsRoles diff --git a/app/api/helpers/mail.py b/app/api/helpers/mail.py index 2f3e7c0a4e..779b3c4598 100644 --- a/app/api/helpers/mail.py +++ b/app/api/helpers/mail.py @@ -16,7 +16,7 @@ from app.api.helpers.log import record_activity from app.api.helpers.system_mails import MAILS, MailType from app.api.helpers.utilities import get_serializer, str_generator, string_empty -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.mail import Mail from app.models.message_setting import MessageSettings from app.models.order import OrderTicket diff --git a/app/api/helpers/pentabarfxml.py b/app/api/helpers/pentabarfxml.py index 9beaed0e87..8f9d129f03 100644 --- a/app/api/helpers/pentabarfxml.py +++ b/app/api/helpers/pentabarfxml.py @@ -7,9 +7,9 @@ from sqlalchemy import Date, asc, func from app.models import db -from app.models.event import Event as EventModel -from app.models.microlocation import Microlocation -from app.models.session import Session +from app.models.Event_Context.event import Event as EventModel +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.session import Session from app.settings import get_settings diff --git a/app/api/helpers/permission_manager.py b/app/api/helpers/permission_manager.py index 66ebf687b5..6c081fd84c 100644 --- a/app/api/helpers/permission_manager.py +++ b/app/api/helpers/permission_manager.py @@ -8,10 +8,10 @@ from app.api.helpers.errors import ForbiddenError, NotFoundError from app.api.helpers.jwt import get_identity from app.api.helpers.permissions import jwt_required -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.event_invoice import EventInvoice from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.user import User diff --git a/app/api/helpers/permissions.py b/app/api/helpers/permissions.py index 318f8c4945..8dec456a26 100644 --- a/app/api/helpers/permissions.py +++ b/app/api/helpers/permissions.py @@ -7,7 +7,7 @@ from app.api.helpers.db import save_to_db from app.api.helpers.errors import ForbiddenError from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event def second_order_decorator(inner_dec): diff --git a/app/api/helpers/query.py b/app/api/helpers/query.py index af0ed56aa0..2a83482e24 100644 --- a/app/api/helpers/query.py +++ b/app/api/helpers/query.py @@ -3,7 +3,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.helpers.errors import ForbiddenError from app.api.helpers.permission_manager import has_access, is_logged_in -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.role import Role from app.models.users_events_role import UsersEventsRoles diff --git a/app/api/helpers/scheduled_jobs.py b/app/api/helpers/scheduled_jobs.py index 8713a9889d..a59829f6bc 100644 --- a/app/api/helpers/scheduled_jobs.py +++ b/app/api/helpers/scheduled_jobs.py @@ -18,10 +18,10 @@ from app.api.helpers.utilities import monthdelta from app.instance import celery from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.event_invoice import EventInvoice from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.ticket import Ticket from app.models.ticket_holder import TicketHolder diff --git a/app/api/helpers/tasks.py b/app/api/helpers/tasks.py index d5bacd2b21..e0a54672e4 100644 --- a/app/api/helpers/tasks.py +++ b/app/api/helpers/tasks.py @@ -43,13 +43,13 @@ from app.models import db from app.models.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms from app.models.discount_code import DiscountCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.exhibitor import Exhibitor from app.models.group import Group from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor from app.models.ticket_holder import TicketHolder from app.models.user import User from app.models.user_follow_group import UserFollowGroup diff --git a/app/api/helpers/user_check_in.py b/app/api/helpers/user_check_in.py index 0e09f6183d..4c78249601 100644 --- a/app/api/helpers/user_check_in.py +++ b/app/api/helpers/user_check_in.py @@ -8,8 +8,8 @@ from app.api.helpers.errors import BadRequestError, UnprocessableEntityError from app.api.helpers.static import STATION_TYPE from app.api.helpers.storage import UPLOAD_PATHS, UploadedFile, generate_hash, upload -from app.models.session import Session -from app.models.station import Station +from app.models.Event_Context.session import Session +from app.models.Event_Context.station import Station from app.models.user_check_in import UserCheckIn diff --git a/app/api/helpers/xcal.py b/app/api/helpers/xcal.py index 4f600a02ed..486c1922d5 100644 --- a/app/api/helpers/xcal.py +++ b/app/api/helpers/xcal.py @@ -3,8 +3,8 @@ from flask import url_for from sqlalchemy import asc -from app.models.event import Event -from app.models.session import Session +from app.models.Event_Context.event import Event +from app.models.Event_Context.session import Session class XCalExporter: diff --git a/app/api/microlocations.py b/app/api/microlocations.py index 6a9cfea3f4..1d535bb094 100644 --- a/app/api/microlocations.py +++ b/app/api/microlocations.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.microlocations import MicrolocationSchema from app.models import db -from app.models.microlocation import Microlocation -from app.models.session import Session +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.session import Session class MicrolocationListPost(ResourceList): diff --git a/app/api/order_statistics/events.py b/app/api/order_statistics/events.py index 0004d9ec00..5803ce7bb7 100644 --- a/app/api/order_statistics/events.py +++ b/app/api/order_statistics/events.py @@ -7,7 +7,7 @@ from app.api.helpers.db import get_count, safe_query_kwargs from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order, OrderTicket from app.models.ticket import Ticket diff --git a/app/api/role_invites.py b/app/api/role_invites.py index 5ef3cf014b..e0826b2d1d 100644 --- a/app/api/role_invites.py +++ b/app/api/role_invites.py @@ -11,7 +11,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.role_invites import RoleInviteSchema from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.role import Role from app.models.role_invite import RoleInvite from app.models.user import User diff --git a/app/api/schema/admin_statistics_schema/events.py b/app/api/schema/admin_statistics_schema/events.py index fc9fb4f120..fc5bdbca44 100644 --- a/app/api/schema/admin_statistics_schema/events.py +++ b/app/api/schema/admin_statistics_schema/events.py @@ -6,7 +6,7 @@ from app.api.helpers.db import get_count from app.api.helpers.utilities import dasherize -from app.models.event import Event +from app.models.Event_Context.event import Event class AdminStatisticsEventSchema(Schema): diff --git a/app/api/schema/event_statistics.py b/app/api/schema/event_statistics.py index 765bbd13e9..d9b0c3a7ae 100644 --- a/app/api/schema/event_statistics.py +++ b/app/api/schema/event_statistics.py @@ -4,9 +4,9 @@ from app.api.helpers.cache import cache from app.api.helpers.utilities import dasherize -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor class EventStatisticsGeneralSchema(Schema): diff --git a/app/api/schema/events.py b/app/api/schema/events.py index 89f8cc59c2..387b2fc7fa 100644 --- a/app/api/schema/events.py +++ b/app/api/schema/events.py @@ -10,7 +10,7 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import GetterRelationship, SoftDeletionSchema, TrimmedEmail -from app.models.event import Event +from app.models.Event_Context.event import Event class DocumentLinkSchema(Schema): diff --git a/app/api/schema/sessions.py b/app/api/schema/sessions.py index e99fea6ac0..8bf9aa5c8e 100644 --- a/app/api/schema/sessions.py +++ b/app/api/schema/sessions.py @@ -14,7 +14,7 @@ from app.api.helpers.validations import validate_complex_fields_json from app.api.schema.base import SoftDeletionSchema from app.models.helpers.versioning import clean_html -from app.models.session import Session +from app.models.Event_Context.session import Session from utils.common import use_defaults diff --git a/app/api/schema/speakers_calls.py b/app/api/schema/speakers_calls.py index b68d86bac7..c552c6d6fe 100644 --- a/app/api/schema/speakers_calls.py +++ b/app/api/schema/speakers_calls.py @@ -5,7 +5,7 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import SoftDeletionSchema -from app.models.speakers_call import SpeakersCall +from app.models.Event_Context.speakers_call import SpeakersCall class SpeakersCallSchema(SoftDeletionSchema): diff --git a/app/api/session_types.py b/app/api/session_types.py index 94810938be..26437be00a 100644 --- a/app/api/session_types.py +++ b/app/api/session_types.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.session_types import SessionTypeSchema from app.models import db -from app.models.session import Session -from app.models.session_type import SessionType +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType class SessionTypeListPost(ResourceList): diff --git a/app/api/sessions.py b/app/api/sessions.py index 363eb9389f..8fdd0855ea 100644 --- a/app/api/sessions.py +++ b/app/api/sessions.py @@ -24,10 +24,10 @@ from app.api.speaker_invites import SpeakerInvite from app.models import db from app.models.exhibitor import Exhibitor -from app.models.microlocation import Microlocation -from app.models.session import Session +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.session import Session from app.models.session_speaker_link import SessionsSpeakersLink -from app.models.session_type import SessionType +from app.models.Event_Context.session_type import SessionType from app.models.speaker import Speaker from app.models.track import Track from app.models.user import User diff --git a/app/api/speaker_invites.py b/app/api/speaker_invites.py index 416c5b75d9..169d76eb7a 100644 --- a/app/api/speaker_invites.py +++ b/app/api/speaker_invites.py @@ -14,8 +14,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.speaker_invites import SpeakerInviteSchema from app.models import db -from app.models.event import Event -from app.models.session import Session +from app.models.Event_Context.event import Event +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.speaker_invite import SpeakerInvite from app.models.user import User diff --git a/app/api/speakers.py b/app/api/speakers.py index 2245e6dadc..a00623fa59 100644 --- a/app/api/speakers.py +++ b/app/api/speakers.py @@ -12,8 +12,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.speakers import SpeakerSchema from app.models import db -from app.models.event import Event -from app.models.session import Session +from app.models.Event_Context.event import Event +from app.models.Event_Context.session import Session from app.models.session_speaker_link import SessionsSpeakersLink from app.models.speaker import Speaker from app.models.user import User diff --git a/app/api/speakers_calls.py b/app/api/speakers_calls.py index abb8334e1e..a0a1b2d134 100644 --- a/app/api/speakers_calls.py +++ b/app/api/speakers_calls.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.speakers_calls import SpeakersCallSchema from app.models import db -from app.models.event import Event -from app.models.speakers_call import SpeakersCall +from app.models.Event_Context.event import Event +from app.models.Event_Context.speakers_call import SpeakersCall class SpeakersCallList(ResourceList): diff --git a/app/api/sponsors.py b/app/api/sponsors.py index 7935c4ef98..8d059d0209 100644 --- a/app/api/sponsors.py +++ b/app/api/sponsors.py @@ -9,7 +9,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.sponsors import SponsorSchema from app.models import db -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor class SponsorListPost(ResourceList): diff --git a/app/api/station.py b/app/api/station.py index 4588bfe961..08ebbba96f 100644 --- a/app/api/station.py +++ b/app/api/station.py @@ -7,9 +7,9 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.station import StationSchema from app.models import db -from app.models.event import Event -from app.models.microlocation import Microlocation -from app.models.station import Station +from app.models.Event_Context.event import Event +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.station import Station class StationList(ResourceList): diff --git a/app/api/station_store_paxs.py b/app/api/station_store_paxs.py index e4c5776b68..58976315f1 100644 --- a/app/api/station_store_paxs.py +++ b/app/api/station_store_paxs.py @@ -6,8 +6,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.station_store_pax import StationStorePaxSchema from app.models import db -from app.models.session import Session -from app.models.station import Station +from app.models.Event_Context.session import Session +from app.models.Event_Context.station import Station from app.models.station_store_pax import StationStorePax diff --git a/app/api/stripe_authorization.py b/app/api/stripe_authorization.py index be0ade2aaa..59d7f16bdb 100644 --- a/app/api/stripe_authorization.py +++ b/app/api/stripe_authorization.py @@ -13,7 +13,7 @@ StripeAuthorizationSchemaPublic, ) from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.stripe_authorization import StripeAuthorization diff --git a/app/api/tags.py b/app/api/tags.py index c8036f7a93..e5f9465aaa 100644 --- a/app/api/tags.py +++ b/app/api/tags.py @@ -5,8 +5,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.tag import TagSchema from app.models import db -from app.models.event import Event -from app.models.tag import Tag +from app.models.Event_Context.event import Event +from app.models.Event_Context.tag import Tag from app.models.ticket_holder import TicketHolder diff --git a/app/api/tax.py b/app/api/tax.py index 0ffc5a4ab0..f00ab5881a 100644 --- a/app/api/tax.py +++ b/app/api/tax.py @@ -9,8 +9,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.tax import TaxSchema, TaxSchemaPublic from app.models import db -from app.models.event import Event -from app.models.tax import Tax +from app.models.Event_Context.event import Event +from app.models.Event_Context.tax import Tax class TaxList(ResourceList): diff --git a/app/api/tickets.py b/app/api/tickets.py index fce5e43ac9..7c1b5dd536 100644 --- a/app/api/tickets.py +++ b/app/api/tickets.py @@ -15,7 +15,7 @@ from app.models import db from app.models.access_code import AccessCode from app.models.discount_code import DiscountCode -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order from app.models.ticket import Ticket, TicketTag, ticket_tags_table from app.models.ticket_holder import TicketHolder diff --git a/app/api/tracks.py b/app/api/tracks.py index e863880290..91f9458900 100644 --- a/app/api/tracks.py +++ b/app/api/tracks.py @@ -8,7 +8,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.tracks import TrackSchema from app.models import db -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.track import Track diff --git a/app/api/translation_channels.py b/app/api/translation_channels.py index 8326b448ce..a67933adcb 100644 --- a/app/api/translation_channels.py +++ b/app/api/translation_channels.py @@ -8,8 +8,8 @@ from app.api.schema.translation_channels import TranslationChannelSchema from app.models import db from app.models.translation_channels import TranslationChannel -from app.models.video_channel import VideoChannel -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_channel import VideoChannel +from app.models.Event_Context.video_stream import VideoStream class TranslationChannelsList(ResourceList): diff --git a/app/api/user_favourite_sessions.py b/app/api/user_favourite_sessions.py index 6f5468356f..10d3207984 100644 --- a/app/api/user_favourite_sessions.py +++ b/app/api/user_favourite_sessions.py @@ -7,8 +7,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.user_favourite_sessions import UserFavouriteSessionSchema from app.models import db -from app.models.event import Event -from app.models.session import Session +from app.models.Event_Context.event import Event +from app.models.Event_Context.session import Session from app.models.user import User from app.models.user_favourite_session import UserFavouriteSession diff --git a/app/api/users.py b/app/api/users.py index 23d9e0941e..1893698022 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -22,19 +22,19 @@ from app.models.access_code import AccessCode from app.models.discount_code import DiscountCode from app.models.email_notification import EmailNotification -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.event_invoice import EventInvoice -from app.models.feedback import Feedback +from app.models.Event_Context.feedback import Feedback from app.models.group import Group from app.models.notification import Notification from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.ticket_holder import TicketHolder from app.models.user import User from app.models.user_follow_group import UserFollowGroup from app.models.users_events_role import UsersEventsRoles -from app.models.video_stream_moderator import VideoStreamModerator +from app.models.Event_Context.video_stream_moderator import VideoStreamModerator logger = logging.getLogger(__name__) diff --git a/app/api/video_channel.py b/app/api/video_channel.py index b0342ea7c9..8246d7046b 100644 --- a/app/api/video_channel.py +++ b/app/api/video_channel.py @@ -5,8 +5,8 @@ from app.api.helpers.permission_manager import has_access, is_logged_in from app.api.schema.video_channel import VideoChannelSchema, VideoChannelSchemaPublic from app.models import db -from app.models.video_channel import VideoChannel -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_channel import VideoChannel +from app.models.Event_Context.video_stream import VideoStream class VideoChannelListPost(ResourceList): diff --git a/app/api/video_channel_stream.py b/app/api/video_channel_stream.py index bcc2ca9635..1750266073 100644 --- a/app/api/video_channel_stream.py +++ b/app/api/video_channel_stream.py @@ -5,8 +5,8 @@ from app.api.helpers.permission_manager import has_access, is_logged_in from app.api.schema.video_channel import VideoChannelSchema, VideoChannelSchemaPublic from app.models import db -from app.models.video_channel import VideoChannel -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_channel import VideoChannel +from app.models.Event_Context.video_stream import VideoStream class VideoChannelListPost(ResourceList): diff --git a/app/api/video_recordings.py b/app/api/video_recordings.py index 32eb673021..52ed708139 100644 --- a/app/api/video_recordings.py +++ b/app/api/video_recordings.py @@ -10,8 +10,8 @@ from app.api.schema.video_recordings import VideoRecordingSchema from app.api.video_channels.bbb import BigBlueButton from app.models import db -from app.models.video_recording import VideoRecording -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_recording import VideoRecording +from app.models.Event_Context.video_stream import VideoStream class VideoRecordingList(ResourceList): diff --git a/app/api/video_stream.py b/app/api/video_stream.py index f88bd85463..1faa54248f 100644 --- a/app/api/video_stream.py +++ b/app/api/video_stream.py @@ -23,12 +23,12 @@ from app.api.schema.video_stream import ChatmosphereSchema, VideoStreamSchema from app.api.video_channels.bbb import BigBlueButton from app.models import db -from app.models.event import Event -from app.models.microlocation import Microlocation -from app.models.video_channel import VideoChannel -from app.models.video_recording import VideoRecording -from app.models.video_stream import VideoStream -from app.models.video_stream_moderator import VideoStreamModerator +from app.models.Event_Context.event import Event +from app.models.Event_Context.microlocation import Microlocation +from app.models.Event_Context.video_channel import VideoChannel +from app.models.Event_Context.video_recording import VideoRecording +from app.models.Event_Context.video_stream import VideoStream +from app.models.Event_Context.video_stream_moderator import VideoStreamModerator logger = logging.getLogger(__name__) diff --git a/app/api/video_stream_moderators.py b/app/api/video_stream_moderators.py index bccfeece9e..b656951736 100644 --- a/app/api/video_stream_moderators.py +++ b/app/api/video_stream_moderators.py @@ -10,8 +10,8 @@ from app.api.schema.video_stream_moderators import VideoStreamModeratorSchema from app.models import db from app.models.user import User -from app.models.video_stream import VideoStream -from app.models.video_stream_moderator import VideoStreamModerator +from app.models.Event_Context.video_stream import VideoStream +from app.models.Event_Context.video_stream_moderator import VideoStreamModerator class VideoStreamModeratorList(ResourceList): diff --git a/app/models/event.py b/app/models/Event_Context/event.py similarity index 99% rename from app/models/event.py rename to app/models/Event_Context/event.py index b4f48c6a35..b6a4dd8264 100644 --- a/app/models/event.py +++ b/app/models/Event_Context/event.py @@ -15,13 +15,13 @@ from app.models import db from app.models.base import SoftDeletionModel from app.models.email_notification import EmailNotification -from app.models.event_topic import EventTopic -from app.models.feedback import Feedback +from app.models.Event_Context.event_topic import EventTopic +from app.models.Event_Context.feedback import Feedback from app.models.helpers.versioning import clean_html, clean_up_string from app.models.order import Order from app.models.role import Role from app.models.search import sync -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.ticket import Ticket from app.models.ticket_fee import get_fee, get_maximum_fee diff --git a/app/models/event_copyright.py b/app/models/Event_Context/event_copyright.py similarity index 100% rename from app/models/event_copyright.py rename to app/models/Event_Context/event_copyright.py diff --git a/app/models/event_location.py b/app/models/Event_Context/event_location.py similarity index 100% rename from app/models/event_location.py rename to app/models/Event_Context/event_location.py diff --git a/app/models/event_orga.py b/app/models/Event_Context/event_orga.py similarity index 100% rename from app/models/event_orga.py rename to app/models/Event_Context/event_orga.py diff --git a/app/models/event_sub_topic.py b/app/models/Event_Context/event_sub_topic.py similarity index 100% rename from app/models/event_sub_topic.py rename to app/models/Event_Context/event_sub_topic.py diff --git a/app/models/event_topic.py b/app/models/Event_Context/event_topic.py similarity index 100% rename from app/models/event_topic.py rename to app/models/Event_Context/event_topic.py diff --git a/app/models/event_type.py b/app/models/Event_Context/event_type.py similarity index 100% rename from app/models/event_type.py rename to app/models/Event_Context/event_type.py diff --git a/app/models/feedback.py b/app/models/Event_Context/feedback.py similarity index 100% rename from app/models/feedback.py rename to app/models/Event_Context/feedback.py diff --git a/app/models/microlocation.py b/app/models/Event_Context/microlocation.py similarity index 100% rename from app/models/microlocation.py rename to app/models/Event_Context/microlocation.py diff --git a/app/models/session.py b/app/models/Event_Context/session.py similarity index 98% rename from app/models/session.py rename to app/models/Event_Context/session.py index a5d697376a..c540efd90b 100644 --- a/app/models/session.py +++ b/app/models/Event_Context/session.py @@ -8,7 +8,7 @@ from app.models import db from app.models.base import SoftDeletionModel -from app.models.feedback import Feedback +from app.models.Event_Context.feedback import Feedback from app.models.helpers.versioning import clean_html, clean_up_string from app.models.user_favourite_session import UserFavouriteSession diff --git a/app/models/session_type.py b/app/models/Event_Context/session_type.py similarity index 100% rename from app/models/session_type.py rename to app/models/Event_Context/session_type.py diff --git a/app/models/speakers_call.py b/app/models/Event_Context/speakers_call.py similarity index 100% rename from app/models/speakers_call.py rename to app/models/Event_Context/speakers_call.py diff --git a/app/models/sponsor.py b/app/models/Event_Context/sponsor.py similarity index 100% rename from app/models/sponsor.py rename to app/models/Event_Context/sponsor.py diff --git a/app/models/station.py b/app/models/Event_Context/station.py similarity index 100% rename from app/models/station.py rename to app/models/Event_Context/station.py diff --git a/app/models/tag.py b/app/models/Event_Context/tag.py similarity index 100% rename from app/models/tag.py rename to app/models/Event_Context/tag.py diff --git a/app/models/tax.py b/app/models/Event_Context/tax.py similarity index 100% rename from app/models/tax.py rename to app/models/Event_Context/tax.py diff --git a/app/models/video_channel.py b/app/models/Event_Context/video_channel.py similarity index 100% rename from app/models/video_channel.py rename to app/models/Event_Context/video_channel.py diff --git a/app/models/video_recording.py b/app/models/Event_Context/video_recording.py similarity index 100% rename from app/models/video_recording.py rename to app/models/Event_Context/video_recording.py diff --git a/app/models/video_stream.py b/app/models/Event_Context/video_stream.py similarity index 97% rename from app/models/video_stream.py rename to app/models/Event_Context/video_stream.py index f492450939..19bdc128f3 100644 --- a/app/models/video_stream.py +++ b/app/models/Event_Context/video_stream.py @@ -7,10 +7,10 @@ from app.api.helpers.permission_manager import has_access from app.models import db from app.models.order import Order -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.ticket_holder import TicketHolder -from app.models.video_channel import VideoChannel +from app.models.Event_Context.video_channel import VideoChannel class VideoStream(db.Model): diff --git a/app/models/video_stream_moderator.py b/app/models/Event_Context/video_stream_moderator.py similarity index 100% rename from app/models/video_stream_moderator.py rename to app/models/Event_Context/video_stream_moderator.py diff --git a/app/models/role_invite.py b/app/models/role_invite.py index 1d1d8cf85a..2e14b2cd57 100644 --- a/app/models/role_invite.py +++ b/app/models/role_invite.py @@ -11,7 +11,7 @@ from app.api.helpers.notification import notify_event_role_invitation from app.api.helpers.permission_manager import has_access from app.models import db -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.user import User from app.settings import get_settings diff --git a/app/models/speaker_invite.py b/app/models/speaker_invite.py index 1a2fe1695d..578e10ca59 100644 --- a/app/models/speaker_invite.py +++ b/app/models/speaker_invite.py @@ -3,7 +3,7 @@ from app.api.helpers.permission_manager import has_access from app.models import db from app.models.helpers.timestamp import Timestamp -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.settings import get_settings diff --git a/app/models/translation_channels.py b/app/models/translation_channels.py index ced2fe7256..14d9214271 100644 --- a/app/models/translation_channels.py +++ b/app/models/translation_channels.py @@ -1,7 +1,7 @@ from sqlalchemy.orm import backref from app.models import db -from app.models.video_channel import VideoChannel +from app.models.Event_Context.video_channel import VideoChannel class TranslationChannel(db.Model): diff --git a/app/models/user.py b/app/models/user.py index 8810535165..fd605cde85 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -18,14 +18,14 @@ from app.models import db from app.models.base import SoftDeletionModel from app.models.custom_system_role import UserSystemRole -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.helpers.versioning import clean_html, clean_up_string from app.models.notification import Notification from app.models.panel_permission import PanelPermission from app.models.permission import Permission from app.models.role import Role from app.models.service import Service -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.user_permission import UserPermission from app.models.users_events_role import UsersEventsRoles as UER diff --git a/tests/all/integration/api/helpers/test_db.py b/tests/all/integration/api/helpers/test_db.py index a463a456c8..4e657d3b95 100644 --- a/tests/all/integration/api/helpers/test_db.py +++ b/tests/all/integration/api/helpers/test_db.py @@ -10,7 +10,7 @@ safe_query_by_id, save_to_db, ) -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.ticket_holder import TicketHolder from tests.factories.attendee import AttendeeSubFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_query.py b/tests/all/integration/api/helpers/test_query.py index f1600771be..2eb96e1513 100644 --- a/tests/all/integration/api/helpers/test_query.py +++ b/tests/all/integration/api/helpers/test_query.py @@ -4,7 +4,7 @@ from app.api.helpers.db import get_or_create from app.api.helpers.errors import ForbiddenError from app.api.helpers.query import event_query -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.order import Order from app.models.role import Role from app.models.ticket import Ticket diff --git a/tests/all/integration/api/session/test_session_forms_api.py b/tests/all/integration/api/session/test_session_forms_api.py index 88c3b55569..3336ba4d71 100644 --- a/tests/all/integration/api/session/test_session_forms_api.py +++ b/tests/all/integration/api/session/test_session_forms_api.py @@ -1,7 +1,7 @@ import json from app.models.custom_form import CustomForms -from app.models.session import Session +from app.models.Event_Context.session import Session from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory from tests.factories.track import TrackSubFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py index 0e1286f3cd..9ae53d6789 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py @@ -4,7 +4,7 @@ from app.models import event from app.models.role import Role from app.models.users_events_role import UsersEventsRoles -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_stream import VideoStream from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.event import EventFactoryBasic from tests.factories.microlocation import MicrolocationSubVideoStreamFactory diff --git a/tests/factories/event.py b/tests/factories/event.py index c0622d3f3a..7d4de8129b 100644 --- a/tests/factories/event.py +++ b/tests/factories/event.py @@ -1,4 +1,4 @@ -from app.models.event import Event +from app.models.Event_Context.event import Event from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/event_copyright.py b/tests/factories/event_copyright.py index 3aeb76fa01..0f388dc669 100644 --- a/tests/factories/event_copyright.py +++ b/tests/factories/event_copyright.py @@ -1,6 +1,6 @@ import factory -from app.models.event_copyright import EventCopyright +from app.models.Event_Context.event_copyright import EventCopyright from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/event_location.py b/tests/factories/event_location.py index e8458a6e42..9500f29655 100644 --- a/tests/factories/event_location.py +++ b/tests/factories/event_location.py @@ -1,4 +1,4 @@ -from app.models.event_location import EventLocation +from app.models.Event_Context.event_location import EventLocation from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/event_sub_topic.py b/tests/factories/event_sub_topic.py index bbc8c9cd18..e60abdf7a8 100644 --- a/tests/factories/event_sub_topic.py +++ b/tests/factories/event_sub_topic.py @@ -1,6 +1,6 @@ import factory -from app.models.event_sub_topic import EventSubTopic +from app.models.Event_Context.event_sub_topic import EventSubTopic from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event_topic import EventTopicFactory diff --git a/tests/factories/event_topic.py b/tests/factories/event_topic.py index 32e197cbf2..4239b6a850 100644 --- a/tests/factories/event_topic.py +++ b/tests/factories/event_topic.py @@ -1,4 +1,4 @@ -from app.models.event_topic import EventTopic +from app.models.Event_Context.event_topic import EventTopic from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/event_type.py b/tests/factories/event_type.py index 52d9436b10..2a13ae7af8 100644 --- a/tests/factories/event_type.py +++ b/tests/factories/event_type.py @@ -1,4 +1,4 @@ -from app.models.event_type import EventType +from app.models.Event_Context.event_type import EventType from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/feedback.py b/tests/factories/feedback.py index 932a78876b..f4494383c8 100644 --- a/tests/factories/feedback.py +++ b/tests/factories/feedback.py @@ -1,6 +1,6 @@ import factory -from app.models.feedback import Feedback +from app.models.Event_Context.feedback import Feedback from tests.factories.base import BaseFactory from tests.factories.session import SessionFactory from tests.factories.user import UserFactory diff --git a/tests/factories/microlocation.py b/tests/factories/microlocation.py index 58ca51dfe7..22d9d01cfa 100644 --- a/tests/factories/microlocation.py +++ b/tests/factories/microlocation.py @@ -1,6 +1,6 @@ import factory -from app.models.microlocation import Microlocation +from app.models.Event_Context.microlocation import Microlocation from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/session.py b/tests/factories/session.py index 94e74b2fe5..94f7036c74 100644 --- a/tests/factories/session.py +++ b/tests/factories/session.py @@ -1,6 +1,6 @@ import factory -from app.models.session import Session +from app.models.Event_Context.session import Session from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/session_type.py b/tests/factories/session_type.py index 8186debb64..08aa14308c 100644 --- a/tests/factories/session_type.py +++ b/tests/factories/session_type.py @@ -1,6 +1,6 @@ import factory -from app.models.session_type import SessionType +from app.models.Event_Context.session_type import SessionType from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/speakers_call.py b/tests/factories/speakers_call.py index d08a9a7e8b..f259eb0922 100644 --- a/tests/factories/speakers_call.py +++ b/tests/factories/speakers_call.py @@ -1,6 +1,6 @@ import factory -from app.models.speakers_call import SpeakersCall +from app.models.Event_Context.speakers_call import SpeakersCall from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/sponsor.py b/tests/factories/sponsor.py index f8701ea911..2652567f69 100644 --- a/tests/factories/sponsor.py +++ b/tests/factories/sponsor.py @@ -1,6 +1,6 @@ import factory -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/station.py b/tests/factories/station.py index 256b3e9704..39ad3dfa69 100644 --- a/tests/factories/station.py +++ b/tests/factories/station.py @@ -1,6 +1,6 @@ import factory -from app.models.station import Station +from app.models.Event_Context.station import Station from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/tax.py b/tests/factories/tax.py index 3ca818c9f9..0330e52b42 100644 --- a/tests/factories/tax.py +++ b/tests/factories/tax.py @@ -1,6 +1,6 @@ import factory -from app.models.tax import Tax +from app.models.Event_Context.tax import Tax from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/video_channel.py b/tests/factories/video_channel.py index 3f2d574c29..abbe12799c 100644 --- a/tests/factories/video_channel.py +++ b/tests/factories/video_channel.py @@ -1,4 +1,4 @@ -from app.models.video_channel import VideoChannel +from app.models.Event_Context.video_channel import VideoChannel from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/video_stream.py b/tests/factories/video_stream.py index f70b4cf012..3d6276475a 100644 --- a/tests/factories/video_stream.py +++ b/tests/factories/video_stream.py @@ -1,4 +1,4 @@ -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_stream import VideoStream from tests.factories import common from tests.factories.base import BaseFactory From d1f74e97d72b5222b3bee6a9caa7e1eb165949fd Mon Sep 17 00:00:00 2001 From: Adam Jennissen Date: Sat, 7 Dec 2024 21:07:12 -0600 Subject: [PATCH 02/17] Added User context --- .vs/ProjectSettings.json | 3 ++ .vs/slnx.sqlite | Bin 0 -> 233472 bytes app/api/access_codes.py | 2 +- app/api/admin_sales/discounted.py | 2 +- app/api/admin_sales/marketer.py | 2 +- app/api/admin_sales/organizer.py | 4 +- app/api/admin_statistics_api/groups.py | 2 +- app/api/admin_statistics_api/users.py | 4 +- app/api/attendees.py | 2 +- app/api/auth.py | 2 +- app/api/chat/rocket_chat.py | 2 +- app/api/custom/check_in_stats.py | 2 +- app/api/custom/group_role_invite.py | 2 +- app/api/custom/groups.py | 4 +- app/api/custom/users_groups_roles.py | 4 +- app/api/discount_codes.py | 2 +- app/api/email_notifications.py | 2 +- app/api/event_copy.py | 2 +- app/api/event_invoices.py | 2 +- app/api/events.py | 6 +-- app/api/feedbacks.py | 2 +- app/api/groups.py | 6 +-- app/api/helpers/auth.py | 4 +- app/api/helpers/csv_jobs_util.py | 2 +- app/api/helpers/group_user_role.py | 2 +- app/api/helpers/import_helpers.py | 4 +- app/api/helpers/jwt.py | 2 +- app/api/helpers/mail.py | 2 +- app/api/helpers/notification.py | 2 +- app/api/helpers/permission_manager.py | 2 +- app/api/helpers/query.py | 2 +- app/api/helpers/tasks.py | 4 +- app/api/helpers/user.py | 4 +- app/api/helpers/user_check_in.py | 2 +- app/api/notifications.py | 2 +- app/api/orders.py | 2 +- app/api/role_invites.py | 4 +- app/api/roles.py | 4 +- app/api/schema/users.py | 2 +- app/api/sessions.py | 2 +- app/api/speaker_invites.py | 2 +- app/api/speakers.py | 2 +- app/api/user_check_in.py | 2 +- app/api/user_emails.py | 4 +- app/api/user_favourite_events.py | 4 +- app/api/user_favourite_sessions.py | 4 +- app/api/user_follow_groups.py | 4 +- app/api/user_permission.py | 2 +- app/api/users.py | 6 +-- app/api/users_events_roles.py | 2 +- app/api/users_groups_roles.py | 4 +- app/api/video_stream_moderators.py | 2 +- app/models/Event_Context/session.py | 2 +- app/models/group.py | 2 +- app/models/role_invite.py | 2 +- app/models/{ => user_context}/user.py | 6 +-- .../{ => user_context}/user_check_in.py | 0 app/models/{ => user_context}/user_email.py | 0 .../user_favourite_event.py | 0 .../user_favourite_session.py | 2 +- .../{ => user_context}/user_follow_group.py | 0 .../{ => user_context}/user_permission.py | 0 .../user_token_blacklist.py | 0 .../{ => user_context}/users_events_role.py | 0 .../{ => user_context}/users_groups_role.py | 0 app/views/blueprints.py | 2 +- docs/general/roles.md | 6 +-- ...720_add_user_token_blacklist_time_table.py | 36 ------------------ .../rev-2019-08-07-01:11:29-f5c3a4fd23fb_.py | 30 --------------- populate_db.py | 4 +- .../api/attendee/test_attendee_access_api.py | 2 +- .../integration/api/event/test_event_roles.py | 2 +- .../api/event/test_event_view_access.py | 2 +- .../integration/api/group/test_group_misc.py | 2 +- .../integration/api/group/test_group_roles.py | 2 +- .../api/helpers/order/test_create_order.py | 2 +- .../all/integration/api/helpers/test_auth.py | 2 +- .../api/helpers/test_notification.py | 2 +- .../all/integration/api/helpers/test_query.py | 2 +- .../api/helpers/test_scheduled_jobs.py | 2 +- .../api/session/test_session_access_api.py | 2 +- .../api/session/test_session_lock_api.py | 2 +- .../api/session/test_session_state_api.py | 2 +- .../speaker/test_speaker_email_override.py | 2 +- .../test_video_stream_access_api.py | 2 +- .../test_video_stream_create_api.py | 2 +- .../test_video_stream_edit_api.py | 2 +- tests/all/integration/auth_helper.py | 2 +- tests/all/integration/utils.py | 2 +- tests/factories/translation_channel.py | 2 +- tests/factories/user.py | 2 +- tests/factories/user_email.py | 2 +- tests/factories/user_favourite_events.py | 4 +- tests/factories/user_favourite_sessions.py | 4 +- tests/factories/user_permission.py | 2 +- tests/factories/user_token_blacklist.py | 2 +- tests/factories/users_events_roles.py | 2 +- tests/hook_main.py | 2 +- 98 files changed, 117 insertions(+), 180 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/slnx.sqlite rename app/models/{ => user_context}/user.py (98%) rename app/models/{ => user_context}/user_check_in.py (100%) rename app/models/{ => user_context}/user_email.py (100%) rename app/models/{ => user_context}/user_favourite_event.py (100%) rename app/models/{ => user_context}/user_favourite_session.py (95%) rename app/models/{ => user_context}/user_follow_group.py (100%) rename app/models/{ => user_context}/user_permission.py (100%) rename app/models/{ => user_context}/user_token_blacklist.py (100%) rename app/models/{ => user_context}/users_events_role.py (100%) rename app/models/{ => user_context}/users_groups_role.py (100%) delete mode 100644 migrations/versions/rev-2019-08-03-05:18:10-4925dd5fd720_add_user_token_blacklist_time_table.py delete mode 100644 migrations/versions/rev-2019-08-07-01:11:29-f5c3a4fd23fb_.py diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000000..f8b4888565 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d752674e25270afe43a62dffad1e885a579fb839 GIT binary patch literal 233472 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%0D-=l|eTXu+ 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 from app.models.user import User +>>> from app.models.user_context.user_context.user import User >>> from app.models.track import Track >>> u = User.query.all()[0] >>> u.can_create(Track, event_id=1) @@ -260,8 +260,8 @@ You can define a user's role for an event in `UsersEventsRoles`. Here's an example showing how a user is assigned as a Track Organizer for an Event (with `event_id = 1`). ``` ->>> from app.models.users_events_roles import UsersEventsRoles as UER ->>> from app.models.user import User +>>> from app.models.user_context.user_context.users_events_roles import UsersEventsRoles as UER +>>> from app.models.user_context.user_context.user import User >>> from app.models.event import Event >>> from app.models.role import Role >>> r = Role.query.filter_by(name='track_organizer').first() diff --git a/migrations/versions/rev-2019-08-03-05:18:10-4925dd5fd720_add_user_token_blacklist_time_table.py b/migrations/versions/rev-2019-08-03-05:18:10-4925dd5fd720_add_user_token_blacklist_time_table.py deleted file mode 100644 index a499ba379a..0000000000 --- a/migrations/versions/rev-2019-08-03-05:18:10-4925dd5fd720_add_user_token_blacklist_time_table.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Add user token blacklist time table - -Revision ID: 4925dd5fd720 -Revises: 2504915ffd08 -Create Date: 2019-08-03 05:18:10.804364 - -""" - -from alembic import op -import sqlalchemy as sa -import sqlalchemy_utils - - -# revision identifiers, used by Alembic. -revision = '4925dd5fd720' -down_revision = '2504915ffd08' - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('user_token_blacklist_time', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('created_at', sa.DateTime(timezone=True), server_default='now', nullable=False), - sa.Column('blacklisted_at', sa.DateTime(timezone=True), server_default='now', nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('user_id', name='user_blacklist_time_uc') - ) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('user_token_blacklist_time') - # ### end Alembic commands ### diff --git a/migrations/versions/rev-2019-08-07-01:11:29-f5c3a4fd23fb_.py b/migrations/versions/rev-2019-08-07-01:11:29-f5c3a4fd23fb_.py deleted file mode 100644 index 11f82050cd..0000000000 --- a/migrations/versions/rev-2019-08-07-01:11:29-f5c3a4fd23fb_.py +++ /dev/null @@ -1,30 +0,0 @@ -"""add stripe test keys - -Revision ID: f5c3a4fd23fb -Revises: 4925dd5fd720 -Create Date: 2019-08-07 01:11:29.736517 - -""" - -from alembic import op -import sqlalchemy as sa -import sqlalchemy_utils - - -# revision identifiers, used by Alembic. -revision = 'f5c3a4fd23fb' -down_revision = '4925dd5fd720' - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('settings', sa.Column('stripe_test_publishable_key', sa.String(), nullable=True)) - op.add_column('settings', sa.Column('stripe_test_secret_key', sa.String(), nullable=True)) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('settings', 'stripe_test_secret_key') - op.drop_column('settings', 'stripe_test_publishable_key') - # ### end Alembic commands ### diff --git a/populate_db.py b/populate_db.py index f136ef5da2..bc55fdedb0 100644 --- a/populate_db.py +++ b/populate_db.py @@ -38,10 +38,10 @@ from app.models.speaker import Speaker from app.models.sponsor import Sponsor from app.models.track import Track -from app.models.user import MODERATOR, REGISTRAR, TRACK_ORGANIZER +from app.models.user_context.user import MODERATOR, REGISTRAR, TRACK_ORGANIZER # User Permissions -from app.models.user_permission import UserPermission +from app.models.user_context.user_permission import UserPermission from app.models.video_channel import VideoChannel SALES = 'sales' diff --git a/tests/all/integration/api/attendee/test_attendee_access_api.py b/tests/all/integration/api/attendee/test_attendee_access_api.py index 78db781efd..db6c1a6645 100644 --- a/tests/all/integration/api/attendee/test_attendee_access_api.py +++ b/tests/all/integration/api/attendee/test_attendee_access_api.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderTicketSubFactory diff --git a/tests/all/integration/api/event/test_event_roles.py b/tests/all/integration/api/event/test_event_roles.py index 952232a288..b467fe2fac 100644 --- a/tests/all/integration/api/event/test_event_roles.py +++ b/tests/all/integration/api/event/test_event_roles.py @@ -3,7 +3,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role from app.models.role_invite import RoleInvite -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.role_invite import RoleInviteSubFactory from tests.factories.users_events_roles import UsersEventsRolesSubFactory diff --git a/tests/all/integration/api/event/test_event_view_access.py b/tests/all/integration/api/event/test_event_view_access.py index 6f19036d31..a6c2180be6 100644 --- a/tests/all/integration/api/event/test_event_view_access.py +++ b/tests/all/integration/api/event/test_event_view_access.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/group/test_group_misc.py b/tests/all/integration/api/group/test_group_misc.py index f52c78fbc0..00d88171f1 100644 --- a/tests/all/integration/api/group/test_group_misc.py +++ b/tests/all/integration/api/group/test_group_misc.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.group import GroupFactory diff --git a/tests/all/integration/api/group/test_group_roles.py b/tests/all/integration/api/group/test_group_roles.py index 810c33ac41..f45100c324 100644 --- a/tests/all/integration/api/group/test_group_roles.py +++ b/tests/all/integration/api/group/test_group_roles.py @@ -3,7 +3,7 @@ from app.api.helpers.db import get_or_create from app.api.helpers.permission_manager import has_access from app.models.role import Role -from app.models.users_groups_role import UsersGroupsRoles +from app.models.user_context.users_groups_role import UsersGroupsRoles from tests.factories.event import EventFactoryBasic from tests.factories.group import GroupSubFactory diff --git a/tests/all/integration/api/helpers/order/test_create_order.py b/tests/all/integration/api/helpers/order/test_create_order.py index f06bc1a155..be7690a521 100644 --- a/tests/all/integration/api/helpers/order/test_create_order.py +++ b/tests/all/integration/api/helpers/order/test_create_order.py @@ -4,7 +4,7 @@ from app.models.order import Order from app.models.role import Role from app.models.ticket_holder import TicketHolder -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeFactoryBase from tests.factories.discount_code import DiscountCodeTicketSubFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_auth.py b/tests/all/integration/api/helpers/test_auth.py index d7fbb5c058..6b30eedab5 100644 --- a/tests/all/integration/api/helpers/test_auth.py +++ b/tests/all/integration/api/helpers/test_auth.py @@ -3,7 +3,7 @@ from flask_login import login_user, logout_user from app.api.helpers.auth import AuthManager -from app.models.user import User +from app.models.user_context.user import User from tests.all.integration.auth_helper import create_user diff --git a/tests/all/integration/api/helpers/test_notification.py b/tests/all/integration/api/helpers/test_notification.py index b1a97390d5..7f2cb9e78c 100644 --- a/tests/all/integration/api/helpers/test_notification.py +++ b/tests/all/integration/api/helpers/test_notification.py @@ -10,7 +10,7 @@ ) from app.models.notification import Notification, NotificationType from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.event_invoice import EventInvoiceSubFactory from tests.factories.order import OrderSubFactory diff --git a/tests/all/integration/api/helpers/test_query.py b/tests/all/integration/api/helpers/test_query.py index 2eb96e1513..d8bb0c1359 100644 --- a/tests/all/integration/api/helpers/test_query.py +++ b/tests/all/integration/api/helpers/test_query.py @@ -8,7 +8,7 @@ from app.models.order import Order from app.models.role import Role from app.models.ticket import Ticket -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_scheduled_jobs.py b/tests/all/integration/api/helpers/test_scheduled_jobs.py index ceb17c11c5..1d110a417a 100644 --- a/tests/all/integration/api/helpers/test_scheduled_jobs.py +++ b/tests/all/integration/api/helpers/test_scheduled_jobs.py @@ -12,7 +12,7 @@ from app.api.helpers.utilities import monthdelta from app.models.role import Role from app.models.ticket_holder import TicketHolder -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from app.settings import get_settings from tests.factories import common from tests.factories.attendee import AttendeeOrderSubFactory, AttendeeSubFactory diff --git a/tests/all/integration/api/session/test_session_access_api.py b/tests/all/integration/api/session/test_session_access_api.py index 643b11fa73..d06c153f1c 100644 --- a/tests/all/integration/api/session/test_session_access_api.py +++ b/tests/all/integration/api/session/test_session_access_api.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speaker import SpeakerSubFactory from tests.factories.user import UserFactory diff --git a/tests/all/integration/api/session/test_session_lock_api.py b/tests/all/integration/api/session/test_session_lock_api.py index e62f486d0e..0ebed753c4 100644 --- a/tests/all/integration/api/session/test_session_lock_api.py +++ b/tests/all/integration/api/session/test_session_lock_api.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory from tests.factories.user import UserFactory diff --git a/tests/all/integration/api/session/test_session_state_api.py b/tests/all/integration/api/session/test_session_state_api.py index 4f583c007d..bc5d1ba538 100644 --- a/tests/all/integration/api/session/test_session_state_api.py +++ b/tests/all/integration/api/session/test_session_state_api.py @@ -4,7 +4,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory from tests.factories.user import UserFactory diff --git a/tests/all/integration/api/speaker/test_speaker_email_override.py b/tests/all/integration/api/speaker/test_speaker_email_override.py index d65810521e..47f2f7b6c4 100644 --- a/tests/all/integration/api/speaker/test_speaker_email_override.py +++ b/tests/all/integration/api/speaker/test_speaker_email_override.py @@ -3,7 +3,7 @@ from app.api.helpers.db import get_or_create from app.models.custom_form import CustomForms from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.speaker import SpeakerSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_access_api.py b/tests/all/integration/api/video_stream/test_video_stream_access_api.py index 145215dfe2..67758af6c4 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_access_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_access_api.py @@ -4,7 +4,7 @@ from app.api.helpers.db import get_or_create from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.microlocation import MicrolocationSubVideoStreamFactory from tests.factories.session import SessionSubFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_create_api.py b/tests/all/integration/api/video_stream/test_video_stream_create_api.py index e3dfa38e02..b3f3828dd7 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_create_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_create_api.py @@ -3,7 +3,7 @@ from app.api.helpers.db import get_or_create from app.models import event from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from app.models.video_stream import VideoStream from tests.factories.event import EventFactoryBasic from tests.factories.microlocation import MicrolocationSubFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py index 9ae53d6789..44297f3a61 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py @@ -3,7 +3,7 @@ from app.api.helpers.db import get_or_create from app.models import event from app.models.role import Role -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from app.models.Event_Context.video_stream import VideoStream from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/auth_helper.py b/tests/all/integration/auth_helper.py index adb9ab481b..f6d17fa12a 100644 --- a/tests/all/integration/auth_helper.py +++ b/tests/all/integration/auth_helper.py @@ -1,5 +1,5 @@ from app.api.helpers.db import save_to_db -from app.models.user import User +from app.models.user_context.user import User def create_user(email, password, is_verified=True): diff --git a/tests/all/integration/utils.py b/tests/all/integration/utils.py index 5c1a58a1d1..2508b5b5fb 100644 --- a/tests/all/integration/utils.py +++ b/tests/all/integration/utils.py @@ -1,6 +1,6 @@ import unittest -from app.models.user import User +from app.models.user_context.user import User from tests.all.integration.auth_helper import create_super_admin from tests.all.integration.setup_database import Setup, db diff --git a/tests/factories/translation_channel.py b/tests/factories/translation_channel.py index 441d7014e8..93a150cb11 100644 --- a/tests/factories/translation_channel.py +++ b/tests/factories/translation_channel.py @@ -1,6 +1,6 @@ import factory -from app.models.translation_channels import TranslationChannel +from app.models.user_context.translation_channels import TranslationChannel from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.video_stream import VideoStreamFactoryBase diff --git a/tests/factories/user.py b/tests/factories/user.py index a5f66a381b..8d14b6aea6 100644 --- a/tests/factories/user.py +++ b/tests/factories/user.py @@ -1,4 +1,4 @@ -from app.models.user import User +from app.models.user_context.user import User from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/user_email.py b/tests/factories/user_email.py index 7063eefbe7..82e378f049 100644 --- a/tests/factories/user_email.py +++ b/tests/factories/user_email.py @@ -1,6 +1,6 @@ import factory -from app.models.user_email import UserEmail +from app.models.user_context.user_email import UserEmail from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.user import UserFactory diff --git a/tests/factories/user_favourite_events.py b/tests/factories/user_favourite_events.py index 5c1739be90..2caf5eb182 100644 --- a/tests/factories/user_favourite_events.py +++ b/tests/factories/user_favourite_events.py @@ -1,7 +1,7 @@ import factory -from app.models.user import User -from app.models.user_favourite_event import UserFavouriteEvent +from app.models.user_context.user import User +from app.models.user_context.user_favourite_event import UserFavouriteEvent from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/user_favourite_sessions.py b/tests/factories/user_favourite_sessions.py index c355a79961..38e97113a8 100644 --- a/tests/factories/user_favourite_sessions.py +++ b/tests/factories/user_favourite_sessions.py @@ -1,7 +1,7 @@ import factory -from app.models.user import User -from app.models.user_favourite_session import UserFavouriteSession +from app.models.user_context.user import User +from app.models.user_context.user_favourite_session import UserFavouriteSession from tests.factories.base import BaseFactory from tests.factories.session import SessionFactory diff --git a/tests/factories/user_permission.py b/tests/factories/user_permission.py index ba0c4478e0..a84f2a53d0 100644 --- a/tests/factories/user_permission.py +++ b/tests/factories/user_permission.py @@ -1,4 +1,4 @@ -from app.models.user_permission import UserPermission +from app.models.user_context.user_permission import UserPermission from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/user_token_blacklist.py b/tests/factories/user_token_blacklist.py index b3aed50b77..ec88371064 100644 --- a/tests/factories/user_token_blacklist.py +++ b/tests/factories/user_token_blacklist.py @@ -1,4 +1,4 @@ -from app.models.user_token_blacklist import UserTokenBlackListTime +from app.models.user_context.user_token_blacklist import UserTokenBlackListTime from tests.factories.base import BaseFactory diff --git a/tests/factories/users_events_roles.py b/tests/factories/users_events_roles.py index 683c748609..8a0e559823 100644 --- a/tests/factories/users_events_roles.py +++ b/tests/factories/users_events_roles.py @@ -1,6 +1,6 @@ import factory -from app.models.users_events_role import UsersEventsRoles +from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic from tests.factories.role import RoleFactory diff --git a/tests/hook_main.py b/tests/hook_main.py index 5d2722ef7f..41c4aebcf4 100644 --- a/tests/hook_main.py +++ b/tests/hook_main.py @@ -12,7 +12,7 @@ from flask import Flask from app.models import db from app.models.role import Role -from app.models.user_token_blacklist import ( # noqa +from app.models.user_context.user_token_blacklist import ( # noqa UserTokenBlackListTime, ) # Workaround for registering unimported model from app.api import routes # noqa Workaround for importing all required models From 3078a42d183de9bfd959561a6da3edd07239bafc Mon Sep 17 00:00:00 2001 From: LincolnOlsen Date: Sun, 8 Dec 2024 12:06:54 -0600 Subject: [PATCH 03/17] changed events.py file --- app/api/admin_sales/events.py | 52 +++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/app/api/admin_sales/events.py b/app/api/admin_sales/events.py index 19511ba2dd..7c5b7871e3 100644 --- a/app/api/admin_sales/events.py +++ b/app/api/admin_sales/events.py @@ -9,21 +9,14 @@ from app.models import db from app.models.Event_Context.event import Event - -class AdminSalesByEventsSchema(Schema): +class EventInfo(Schema): """ - Sales summarized by event - - Provides - event(name), - date, - count of tickets and total sales for orders grouped by status + This class holds information about the event. + Holds information on the event type, name, date, and owners. """ class Meta: - type_ = 'admin-sales-by-events' - self_view = 'v1.admin_sales_by_events' - inflect = dasherize + type_ = 'event-info' id = fields.String() identifier = fields.String() @@ -34,12 +27,6 @@ class Meta: ends_at = fields.DateTime() payment_currency = fields.String() payment_country = fields.String() - completed_order_sales = fields.Integer(dump_only=True) - placed_order_sales = fields.Integer(dump_only=True) - pending_order_sales = fields.Integer(dump_only=True) - completed_order_tickets = fields.Integer(dump_only=True) - placed_order_tickets = fields.Integer(dump_only=True) - pending_order_tickets = fields.Integer(dump_only=True) type = fields.Method('event_type') owner = fields.Method('event_owner') owner_id = fields.Method('event_owner_id') @@ -60,6 +47,35 @@ def event_type(self, obj): elif obj.location_name: t = 'Venue' return str(t) + + +class EventSales(Schema): + """ + This class holds sales data for the event. + The data is grouped by order status. + """ + + class Meta: + type_ = 'event-sales' + + completed_order_sales = fields.Integer(dump_only=True) + placed_order_sales = fields.Integer(dump_only=True) + pending_order_sales = fields.Integer(dump_only=True) + + + +class EventTickets(Schema): + """ + This class holds ticket data for the event. + The data is grouped by order status. + """ + + class Meta: + type_ = 'event-tickets' + + completed_order_tickets = fields.Integer(dump_only=True) + placed_order_tickets = fields.Integer(dump_only=True) + pending_order_tickets = fields.Integer(dump_only=True) class AdminSalesByEventsList(ResourceList): @@ -116,4 +132,4 @@ def after_get(self, res): 'model': Event, 'session': db.session, 'methods': {'query': query, 'after_get': after_get}, - } + } \ No newline at end of file From 6b8ecc7900f25d274c4b6afff6153606dd3a67f1 Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sun, 8 Dec 2024 13:09:53 -0600 Subject: [PATCH 04/17] Financial_Context module added --- app/api/access_codes.py | 4 ++-- app/api/admin_sales/discounted.py | 4 ++-- app/api/admin_sales/invoices.py | 2 +- app/api/admin_sales/locations.py | 2 +- app/api/admin_sales/marketer.py | 2 +- app/api/admin_sales/organizer.py | 2 +- app/api/admin_sales/utils.py | 4 ++-- app/api/attendees.py | 6 +++--- app/api/custom/attendees.py | 4 ++-- app/api/custom/badge_forms.py | 2 +- app/api/custom/check_in_stats.py | 2 +- app/api/custom/events.py | 6 +++--- app/api/custom/invoices.py | 4 ++-- app/api/custom/orders.py | 10 +++++----- app/api/custom/tickets.py | 2 +- app/api/data_layers/ChargesLayer.py | 2 +- app/api/data_layers/EventCopyLayer.py | 4 ++-- app/api/discount_codes.py | 6 +++--- app/api/event_copy.py | 4 ++-- app/api/event_invoices.py | 2 +- app/api/events.py | 12 ++++++------ app/api/helpers/badge_forms.py | 2 +- app/api/helpers/csv_jobs_util.py | 6 +++--- app/api/helpers/custom_forms.py | 2 +- app/api/helpers/event_invoices.py | 2 +- app/api/helpers/mail.py | 4 ++-- app/api/helpers/order.py | 8 ++++---- app/api/helpers/payment.py | 2 +- app/api/helpers/permission_manager.py | 4 ++-- app/api/helpers/scheduled_jobs.py | 8 ++++---- app/api/helpers/tasks.py | 6 +++--- app/api/helpers/user.py | 4 ++-- app/api/order_statistics/events.py | 4 ++-- app/api/order_statistics/tickets.py | 4 ++-- app/api/orders.py | 4 ++-- app/api/schema/access_codes.py | 2 +- app/api/schema/discount_codes.py | 4 ++-- app/api/schema/tickets.py | 4 ++-- app/api/ticket_tags.py | 2 +- app/api/tickets.py | 10 +++++----- app/api/user_check_in.py | 8 ++++---- app/api/users.py | 10 +++++----- app/models/Event_Context/event.py | 8 ++++---- app/models/Event_Context/video_stream.py | 4 ++-- .../{ => Financial_Context}/access_code.py | 4 ++-- .../{ => Financial_Context}/discount_code.py | 6 +++--- .../{ => Financial_Context}/event_invoice.py | 4 ++-- app/models/{ => Financial_Context}/order.py | 2 +- app/models/{ => Financial_Context}/ticket.py | 4 ++-- app/models/{ => Financial_Context}/ticket_fee.py | 0 .../{ => Financial_Context}/ticket_holder.py | 0 app/views/elastic_cron_helpers.py | 2 +- populate_db.py | 16 ++++++++-------- .../event_invoices/test_event_invoices_access.py | 2 +- .../api/helpers/order/test_create_order.py | 4 ++-- .../api/helpers/order/test_edit_order.py | 4 ++-- tests/all/integration/api/helpers/test_db.py | 2 +- tests/all/integration/api/helpers/test_order.py | 2 +- tests/all/integration/api/helpers/test_query.py | 4 ++-- .../api/helpers/test_scheduled_jobs.py | 2 +- .../integration/api/station/test_stations_api.py | 2 +- .../video_stream/test_video_stream_create_api.py | 2 +- tests/factories/access_code.py | 2 +- tests/factories/attendee.py | 2 +- tests/factories/discount_code.py | 2 +- tests/factories/event_invoice.py | 2 +- tests/factories/order.py | 2 +- tests/factories/ticket.py | 2 +- tests/factories/ticket_fee.py | 2 +- tests/factories/ticket_tag.py | 2 +- tests/factories/translation_channel.py | 2 +- 71 files changed, 139 insertions(+), 139 deletions(-) rename app/models/{ => Financial_Context}/access_code.py (95%) rename app/models/{ => Financial_Context}/discount_code.py (94%) rename app/models/{ => Financial_Context}/event_invoice.py (98%) rename app/models/{ => Financial_Context}/order.py (98%) rename app/models/{ => Financial_Context}/ticket.py (97%) rename app/models/{ => Financial_Context}/ticket_fee.py (100%) rename app/models/{ => Financial_Context}/ticket_holder.py (100%) diff --git a/app/api/access_codes.py b/app/api/access_codes.py index 1a328848d1..1392c7e72f 100644 --- a/app/api/access_codes.py +++ b/app/api/access_codes.py @@ -11,9 +11,9 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.access_codes import AccessCodeSchema from app.models import db -from app.models.access_code import AccessCode +from app.models.Financial_Context.access_code import AccessCode from app.models.Event_Context.event import Event -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket from app.models.user_context.user import User diff --git a/app/api/admin_sales/discounted.py b/app/api/admin_sales/discounted.py index 30eb93269d..a1e516f2c2 100644 --- a/app/api/admin_sales/discounted.py +++ b/app/api/admin_sales/discounted.py @@ -6,9 +6,9 @@ from app.api.bootstrap import api from app.api.helpers.utilities import dasherize from app.models import db -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event -from app.models.order import Order, OrderTicket +from app.models.Financial_Context.order import Order, OrderTicket from app.models.user_context.user import User diff --git a/app/api/admin_sales/invoices.py b/app/api/admin_sales/invoices.py index 9a192ce34d..bfb5056dfe 100644 --- a/app/api/admin_sales/invoices.py +++ b/app/api/admin_sales/invoices.py @@ -5,7 +5,7 @@ from app.api.bootstrap import api from app.api.helpers.utilities import dasherize from app.models import db -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice class AdminSalesInvoicesSchema(Schema): diff --git a/app/api/admin_sales/locations.py b/app/api/admin_sales/locations.py index 401f3c50dc..eab81d0ccf 100644 --- a/app/api/admin_sales/locations.py +++ b/app/api/admin_sales/locations.py @@ -7,7 +7,7 @@ from app.api.helpers.utilities import dasherize from app.models import db from app.models.Event_Context.event import Event -from app.models.order import Order, OrderTicket +from app.models.Financial_Context.order import Order, OrderTicket def sales_per_location_by_status(status): diff --git a/app/api/admin_sales/marketer.py b/app/api/admin_sales/marketer.py index 726bc79a10..78b2ec2c6a 100644 --- a/app/api/admin_sales/marketer.py +++ b/app/api/admin_sales/marketer.py @@ -5,7 +5,7 @@ from app.api.admin_sales.utils import summary from app.api.bootstrap import api from app.models import db -from app.models.order import Order, OrderTicket +from app.models.Financial_Context.order import Order, OrderTicket from app.models.user_context.user import User diff --git a/app/api/admin_sales/organizer.py b/app/api/admin_sales/organizer.py index 48ea0b2496..a98521cc45 100644 --- a/app/api/admin_sales/organizer.py +++ b/app/api/admin_sales/organizer.py @@ -8,7 +8,7 @@ from app.api.helpers.utilities import dasherize from app.models import db from app.models.Event_Context.event import Event -from app.models.order import Order, OrderTicket +from app.models.Financial_Context.order import Order, OrderTicket from app.models.role import Role from app.models.user_context.user import User from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/admin_sales/utils.py b/app/api/admin_sales/utils.py index 7a40179f99..9a3fdcd8aa 100644 --- a/app/api/admin_sales/utils.py +++ b/app/api/admin_sales/utils.py @@ -4,8 +4,8 @@ """ from sqlalchemy import func -from app.models.order import Order -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket_holder import TicketHolder def status_summary(sales_summary, tickets_summary, status): diff --git a/app/api/attendees.py b/app/api/attendees.py index a586c20c5e..41844962ed 100644 --- a/app/api/attendees.py +++ b/app/api/attendees.py @@ -13,9 +13,9 @@ from app.api.helpers.query import event_query from app.api.schema.attendees import AttendeeSchema from app.models import db -from app.models.order import Order -from app.models.ticket import Ticket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.settings import get_settings diff --git a/app/api/custom/attendees.py b/app/api/custom/attendees.py index b9f1de1e25..bdfe810127 100644 --- a/app/api/custom/attendees.py +++ b/app/api/custom/attendees.py @@ -9,8 +9,8 @@ from app.api.helpers.permission_manager import has_access from app.api.helpers.permissions import jwt_required from app.models import db -from app.models.order import Order -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket_holder import TicketHolder attendee_blueprint = Blueprint('attendee_blueprint', __name__, url_prefix='/v1') diff --git a/app/api/custom/badge_forms.py b/app/api/custom/badge_forms.py index 1f2ca7a9b1..686907b19b 100644 --- a/app/api/custom/badge_forms.py +++ b/app/api/custom/badge_forms.py @@ -10,7 +10,7 @@ ) from app.api.helpers.permission_manager import has_access from app.models.badge_form import BadgeForms -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder badge_forms_routes = Blueprint( 'badge_forms_routes', __name__, url_prefix='/v1/badge-forms' diff --git a/app/api/custom/check_in_stats.py b/app/api/custom/check_in_stats.py index ddfdcacf7d..d7ee037bbd 100644 --- a/app/api/custom/check_in_stats.py +++ b/app/api/custom/check_in_stats.py @@ -11,7 +11,7 @@ from app.models.Event_Context.session_type import SessionType from app.models.Event_Context.station import Station from app.models.station_store_pax import StationStorePax -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.track import Track from app.models.user_context.user_check_in import UserCheckIn diff --git a/app/api/custom/events.py b/app/api/custom/events.py index ce8fc444af..656c906bfe 100644 --- a/app/api/custom/events.py +++ b/app/api/custom/events.py @@ -12,14 +12,14 @@ from app.api.schema.speakers import SpeakerReorderSchema from app.api.schema.virtual_check_in import VirtualCheckInSchema from app.models import db -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event from app.models.exhibitor import Exhibitor from app.models.Event_Context.microlocation import Microlocation -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder events_routes = Blueprint('events_routes', __name__, url_prefix='/v1/events') diff --git a/app/api/custom/invoices.py b/app/api/custom/invoices.py index be067f59c2..e8feec35b3 100644 --- a/app/api/custom/invoices.py +++ b/app/api/custom/invoices.py @@ -12,8 +12,8 @@ from app.api.helpers.order import create_pdf_tickets_for_holder from app.api.helpers.permission_manager import has_access from app.api.helpers.storage import UPLOAD_PATHS, generate_hash -from app.models.event_invoice import EventInvoice -from app.models.order import Order +from app.models.Financial_Context.event_invoice import EventInvoice +from app.models.Financial_Context.order import Order event_blueprint = Blueprint('event_blueprint', __name__, url_prefix='/v1/events') diff --git a/app/api/custom/orders.py b/app/api/custom/orders.py index 14f3bc391c..7f13ce9033 100644 --- a/app/api/custom/orders.py +++ b/app/api/custom/orders.py @@ -21,11 +21,11 @@ from app.api.schema.orders import OrderSchema from app.extensions.limiter import limiter from app.models import db -from app.models.access_code import AccessCode -from app.models.discount_code import DiscountCode -from app.models.order import Order, OrderTicket -from app.models.ticket import Ticket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.access_code import AccessCode +from app.models.Financial_Context.discount_code import DiscountCode +from app.models.Financial_Context.order import Order, OrderTicket +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_holder import TicketHolder order_blueprint = Blueprint('order_blueprint', __name__, url_prefix='/v1/orders') ticket_blueprint = Blueprint('ticket_blueprint', __name__, url_prefix='/v1/tickets') diff --git a/app/api/custom/tickets.py b/app/api/custom/tickets.py index 32a568e75d..700059d084 100644 --- a/app/api/custom/tickets.py +++ b/app/api/custom/tickets.py @@ -3,7 +3,7 @@ from app.api.helpers.errors import NotFoundError from app.models.badge_field_form import BadgeFieldForms -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket ticket_routes = Blueprint('ticket_routes', __name__, url_prefix='/v1/tickets') diff --git a/app/api/data_layers/ChargesLayer.py b/app/api/data_layers/ChargesLayer.py index fb646dbcdc..9ed60a7e4e 100644 --- a/app/api/data_layers/ChargesLayer.py +++ b/app/api/data_layers/ChargesLayer.py @@ -3,7 +3,7 @@ from app.api.helpers.errors import ConflictError, UnprocessableEntityError from app.api.helpers.ticketing import TicketingManager -from app.models.order import Order +from app.models.Financial_Context.order import Order class ChargesLayer(BaseDataLayer): diff --git a/app/api/data_layers/EventCopyLayer.py b/app/api/data_layers/EventCopyLayer.py index 472b2a6597..ca2fd1e7cc 100644 --- a/app/api/data_layers/EventCopyLayer.py +++ b/app/api/data_layers/EventCopyLayer.py @@ -7,13 +7,13 @@ from app.api.helpers.files import create_save_resized_image from app.models import db from app.models.custom_form import CustomForms -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation from app.models.social_link import SocialLink from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket from app.models.track import Track diff --git a/app/api/discount_codes.py b/app/api/discount_codes.py index bd6b2f0d82..0d35374ea0 100644 --- a/app/api/discount_codes.py +++ b/app/api/discount_codes.py @@ -22,10 +22,10 @@ DiscountCodeSchemaTicket, ) from app.models import db -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event -from app.models.event_invoice import EventInvoice -from app.models.ticket import Ticket +from app.models.Financial_Context.event_invoice import EventInvoice +from app.models.Financial_Context.ticket import Ticket from app.models.user_context.user import User diff --git a/app/api/event_copy.py b/app/api/event_copy.py index 966c3f77c5..26defc9fff 100644 --- a/app/api/event_copy.py +++ b/app/api/event_copy.py @@ -5,14 +5,14 @@ from app.api.helpers.permission_manager import has_access from app.models import db from app.models.custom_form import CustomForms -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation from app.models.social_link import SocialLink from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor from app.models.Event_Context.tax import Tax -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket from app.models.track import Track from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/event_invoices.py b/app/api/event_invoices.py index ef87b8001a..c26d7ce1be 100644 --- a/app/api/event_invoices.py +++ b/app/api/event_invoices.py @@ -12,7 +12,7 @@ from app.api.orders import order_misc_routes from app.api.schema.event_invoices import EventInvoiceSchema from app.models import db -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice from app.models.user_context.user import User from app.settings import get_settings diff --git a/app/api/events.py b/app/api/events.py index 37d64df9ff..c56197d4d2 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -35,20 +35,20 @@ # models from app.models import db -from app.models.access_code import AccessCode +from app.models.Financial_Context.access_code import AccessCode from app.models.custom_form import CustomForms -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.email_notification import EmailNotification from app.models.Event_Context.event import Event from app.models.Event_Context.event_copyright import EventCopyright -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice from app.models.exhibitor import Exhibitor from app.models.faq import Faq from app.models.faq_type import FaqType from app.models.Event_Context.feedback import Feedback from app.models.group import Group from app.models.Event_Context.microlocation import Microlocation -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.role import Role from app.models.role_invite import RoleInvite from app.models.Event_Context.session import Session @@ -60,8 +60,8 @@ from app.models.Event_Context.sponsor import Sponsor from app.models.stripe_authorization import StripeAuthorization from app.models.Event_Context.tax import Tax -from app.models.ticket import Ticket, TicketTag -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket import Ticket, TicketTag +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.track import Track from app.models.user_context.user import ( MARKETER, diff --git a/app/api/helpers/badge_forms.py b/app/api/helpers/badge_forms.py index cb37c0d1a2..c9c7cefdaa 100644 --- a/app/api/helpers/badge_forms.py +++ b/app/api/helpers/badge_forms.py @@ -9,7 +9,7 @@ from app.api.helpers.utilities import to_snake_case from app.models.badge_field_form import BadgeFieldForms from app.models.custom_form import CustomForms -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder def file_pdf_path(self) -> str: diff --git a/app/api/helpers/csv_jobs_util.py b/app/api/helpers/csv_jobs_util.py index 47c70a985e..ca0431f05a 100644 --- a/app/api/helpers/csv_jobs_util.py +++ b/app/api/helpers/csv_jobs_util.py @@ -3,10 +3,10 @@ from app.api.admin_sales.utils import event_type, summary from app.api.helpers.group_user_role import get_user_group_role from app.models import db -from app.models.access_code import AccessCode +from app.models.Financial_Context.access_code import AccessCode from app.models.helpers.versioning import strip_tags -from app.models.order import OrderTicket -from app.models.ticket import access_codes_tickets +from app.models.Financial_Context.order import OrderTicket +from app.models.Financial_Context.ticket import access_codes_tickets from app.models.user_context.user_check_in import VirtualCheckIn diff --git a/app/api/helpers/custom_forms.py b/app/api/helpers/custom_forms.py index 26f5155c31..64d88885a3 100644 --- a/app/api/helpers/custom_forms.py +++ b/app/api/helpers/custom_forms.py @@ -5,7 +5,7 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.schema.base import TrimmedEmail from app.models.custom_form import CustomForms -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket def object_as_dict(obj): diff --git a/app/api/helpers/event_invoices.py b/app/api/helpers/event_invoices.py index f20fd7633c..6b98144357 100644 --- a/app/api/helpers/event_invoices.py +++ b/app/api/helpers/event_invoices.py @@ -1,6 +1,6 @@ import datetime -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice def fetch_event_invoices(invoice_status): diff --git a/app/api/helpers/mail.py b/app/api/helpers/mail.py index ee9fa0f30a..984bdc34db 100644 --- a/app/api/helpers/mail.py +++ b/app/api/helpers/mail.py @@ -19,8 +19,8 @@ from app.models.Event_Context.event import Event from app.models.mail import Mail from app.models.message_setting import MessageSettings -from app.models.order import OrderTicket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import OrderTicket +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.settings import get_settings diff --git a/app/api/helpers/order.py b/app/api/helpers/order.py index 0b2de0f102..a8afa817ff 100644 --- a/app/api/helpers/order.py +++ b/app/api/helpers/order.py @@ -22,11 +22,11 @@ ) from app.api.helpers.storage import UPLOAD_PATHS from app.models import db -from app.models.order import OrderTicket +from app.models.Financial_Context.order import OrderTicket from app.models.setting import Setting -from app.models.ticket import Ticket -from app.models.ticket_fee import TicketFees -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_fee import TicketFees +from app.models.Financial_Context.ticket_holder import TicketHolder from app.settings import get_settings diff --git a/app/api/helpers/payment.py b/app/api/helpers/payment.py index 01fd8b7894..85db1dfcbd 100644 --- a/app/api/helpers/payment.py +++ b/app/api/helpers/payment.py @@ -11,7 +11,7 @@ from app.api.helpers.db import safe_query, save_to_db from app.api.helpers.errors import ConflictError, ForbiddenError from app.api.helpers.utilities import represents_int, round_money -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.stripe_authorization import StripeAuthorization from app.settings import Environment, get_settings diff --git a/app/api/helpers/permission_manager.py b/app/api/helpers/permission_manager.py index 30238d1611..01be6e14d6 100644 --- a/app/api/helpers/permission_manager.py +++ b/app/api/helpers/permission_manager.py @@ -9,8 +9,8 @@ from app.api.helpers.jwt import get_identity from app.api.helpers.permissions import jwt_required from app.models.Event_Context.event import Event -from app.models.event_invoice import EventInvoice -from app.models.order import Order +from app.models.Financial_Context.event_invoice import EventInvoice +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.user_context.user import User diff --git a/app/api/helpers/scheduled_jobs.py b/app/api/helpers/scheduled_jobs.py index a59829f6bc..fa8e04553e 100644 --- a/app/api/helpers/scheduled_jobs.py +++ b/app/api/helpers/scheduled_jobs.py @@ -19,12 +19,12 @@ from app.instance import celery from app.models import db from app.models.Event_Context.event import Event -from app.models.event_invoice import EventInvoice -from app.models.order import Order +from app.models.Financial_Context.event_invoice import EventInvoice +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.ticket import Ticket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_holder import TicketHolder from app.settings import get_settings from app.views.redis_store import redis_store diff --git a/app/api/helpers/tasks.py b/app/api/helpers/tasks.py index 0624f84f4f..f18f6af545 100644 --- a/app/api/helpers/tasks.py +++ b/app/api/helpers/tasks.py @@ -42,15 +42,15 @@ from app.instance import create_app from app.models import db from app.models.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event from app.models.exhibitor import Exhibitor from app.models.group import Group -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.models.user_context.user_follow_group import UserFollowGroup from app.settings import get_settings diff --git a/app/api/helpers/user.py b/app/api/helpers/user.py index 888ce75d04..569a29ad3e 100644 --- a/app/api/helpers/user.py +++ b/app/api/helpers/user.py @@ -7,8 +7,8 @@ from app.api.helpers.db import save_to_db from app.api.helpers.errors import ForbiddenError, UnprocessableEntityError from app.models import db -from app.models.user_context.user_context.user import User -from app.models.user_context.user_context.user_check_in import VirtualCheckIn +from app.models.user_context.user import User +from app.models.user_context.user_check_in import VirtualCheckIn def modify_email_for_user_to_be_deleted(user): diff --git a/app/api/order_statistics/events.py b/app/api/order_statistics/events.py index 5803ce7bb7..541eaa267e 100644 --- a/app/api/order_statistics/events.py +++ b/app/api/order_statistics/events.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import dasherize from app.models import db from app.models.Event_Context.event import Event -from app.models.order import Order, OrderTicket -from app.models.ticket import Ticket +from app.models.Financial_Context.order import Order, OrderTicket +from app.models.Financial_Context.ticket import Ticket class OrderStatisticsEventSchema(Schema): diff --git a/app/api/order_statistics/tickets.py b/app/api/order_statistics/tickets.py index 2989200a98..8f36ec06da 100644 --- a/app/api/order_statistics/tickets.py +++ b/app/api/order_statistics/tickets.py @@ -7,8 +7,8 @@ from app.api.helpers.db import get_count from app.api.helpers.utilities import dasherize from app.models import db -from app.models.order import Order, OrderTicket -from app.models.ticket import Ticket +from app.models.Financial_Context.order import Order, OrderTicket +from app.models.Financial_Context.ticket import Ticket def calculated_sale_by_status(ticket_id, status): diff --git a/app/api/orders.py b/app/api/orders.py index 49c2a40f74..957ed57741 100644 --- a/app/api/orders.py +++ b/app/api/orders.py @@ -42,8 +42,8 @@ from app.api.schema.attendees import AttendeeSchema from app.api.schema.orders import OrderSchema from app.models import db -from app.models.order import Order, OrderTicket, get_updatable_fields -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order, OrderTicket, get_updatable_fields +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.settings import get_settings diff --git a/app/api/schema/access_codes.py b/app/api/schema/access_codes.py index 084bcb94e0..d9f4ab9550 100644 --- a/app/api/schema/access_codes.py +++ b/app/api/schema/access_codes.py @@ -5,7 +5,7 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import SoftDeletionSchema -from app.models.access_code import AccessCode +from app.models.Financial_Context.access_code import AccessCode from utils.common import use_defaults diff --git a/app/api/schema/discount_codes.py b/app/api/schema/discount_codes.py index 49936592ff..68780e61c3 100644 --- a/app/api/schema/discount_codes.py +++ b/app/api/schema/discount_codes.py @@ -7,8 +7,8 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import SoftDeletionSchema -from app.models.discount_code import DiscountCode -from app.models.ticket import Ticket +from app.models.Financial_Context.discount_code import DiscountCode +from app.models.Financial_Context.ticket import Ticket class DiscountCodeSchemaPublic(SoftDeletionSchema): diff --git a/app/api/schema/tickets.py b/app/api/schema/tickets.py index 415b08c3e3..684a594073 100644 --- a/app/api/schema/tickets.py +++ b/app/api/schema/tickets.py @@ -6,8 +6,8 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import SoftDeletionSchema -from app.models.discount_code import DiscountCode -from app.models.ticket import Ticket +from app.models.Financial_Context.discount_code import DiscountCode +from app.models.Financial_Context.ticket import Ticket from utils.common import use_defaults diff --git a/app/api/ticket_tags.py b/app/api/ticket_tags.py index 9a93f63d44..4f37eba6c0 100644 --- a/app/api/ticket_tags.py +++ b/app/api/ticket_tags.py @@ -8,7 +8,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.ticket_tags import TicketTagSchema from app.models import db -from app.models.ticket import Ticket, TicketTag, ticket_tags_table +from app.models.Financial_Context.ticket import Ticket, TicketTag, ticket_tags_table class TicketTagListPost(ResourceList): diff --git a/app/api/tickets.py b/app/api/tickets.py index 7c1b5dd536..56894ff2e8 100644 --- a/app/api/tickets.py +++ b/app/api/tickets.py @@ -13,12 +13,12 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.tickets import TicketSchema, TicketSchemaPublic from app.models import db -from app.models.access_code import AccessCode -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.access_code import AccessCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event -from app.models.order import Order -from app.models.ticket import Ticket, TicketTag, ticket_tags_table -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket import Ticket, TicketTag, ticket_tags_table +from app.models.Financial_Context.ticket_holder import TicketHolder tickets_routes = Blueprint('tickets_routes', __name__, url_prefix='/v1/events') diff --git a/app/api/user_check_in.py b/app/api/user_check_in.py index d0b176d78e..8a417906b1 100644 --- a/app/api/user_check_in.py +++ b/app/api/user_check_in.py @@ -17,10 +17,10 @@ from app.api.schema.station import StationSchema from app.api.schema.user_check_in import UserCheckInSchema from app.models import db -from app.models.session import Session -from app.models.session_type import SessionType -from app.models.station import Station -from app.models.ticket_holder import TicketHolder +from app.models.Event_Context.session import Session +from app.models.Event_Context.session_type import SessionType +from app.models.Event_Context.station import Station +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.track import Track from app.models.user_context.user_check_in import UserCheckIn diff --git a/app/api/users.py b/app/api/users.py index 3ee00c76db..4a679185a5 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -19,18 +19,18 @@ ) from app.api.schema.users import UserSchema, UserSchemaPublic from app.models import db -from app.models.access_code import AccessCode -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.access_code import AccessCode +from app.models.Financial_Context.discount_code import DiscountCode from app.models.email_notification import EmailNotification from app.models.Event_Context.event import Event -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Event_Context.feedback import Feedback from app.models.group import Group from app.models.notification import Notification -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.models.user_context.user_follow_group import UserFollowGroup from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/models/Event_Context/event.py b/app/models/Event_Context/event.py index b6a4dd8264..16513ceec0 100644 --- a/app/models/Event_Context/event.py +++ b/app/models/Event_Context/event.py @@ -18,14 +18,14 @@ from app.models.Event_Context.event_topic import EventTopic from app.models.Event_Context.feedback import Feedback from app.models.helpers.versioning import clean_html, clean_up_string -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.role import Role from app.models.search import sync from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.ticket import Ticket -from app.models.ticket_fee import get_fee, get_maximum_fee -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_fee import get_fee, get_maximum_fee +from app.models.Financial_Context.ticket_holder import TicketHolder from app.settings import get_settings diff --git a/app/models/Event_Context/video_stream.py b/app/models/Event_Context/video_stream.py index 19bdc128f3..ba74680fe8 100644 --- a/app/models/Event_Context/video_stream.py +++ b/app/models/Event_Context/video_stream.py @@ -6,10 +6,10 @@ from app.api.helpers.permission_manager import has_access from app.models import db -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.speaker import Speaker -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.Event_Context.video_channel import VideoChannel diff --git a/app/models/access_code.py b/app/models/Financial_Context/access_code.py similarity index 95% rename from app/models/access_code.py rename to app/models/Financial_Context/access_code.py index bc8ba445da..fbaa4e7bae 100644 --- a/app/models/access_code.py +++ b/app/models/Financial_Context/access_code.py @@ -6,8 +6,8 @@ from app.api.helpers.db import get_count from app.models import db from app.models.base import SoftDeletionModel -from app.models.order import Order -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket_holder import TicketHolder @dataclass(init=False, unsafe_hash=True) diff --git a/app/models/discount_code.py b/app/models/Financial_Context/discount_code.py similarity index 94% rename from app/models/discount_code.py rename to app/models/Financial_Context/discount_code.py index f19d306730..e51638a267 100644 --- a/app/models/discount_code.py +++ b/app/models/Financial_Context/discount_code.py @@ -6,9 +6,9 @@ from app.api.helpers.ticketing import is_discount_available, validate_discount_code from app.models import db from app.models.base import SoftDeletionModel -from app.models.order import Order -from app.models.ticket import Ticket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_holder import TicketHolder class DiscountCode(SoftDeletionModel): diff --git a/app/models/event_invoice.py b/app/models/Financial_Context/event_invoice.py similarity index 98% rename from app/models/event_invoice.py rename to app/models/Financial_Context/event_invoice.py index 8ef88e9167..416d191815 100644 --- a/app/models/event_invoice.py +++ b/app/models/Financial_Context/event_invoice.py @@ -12,9 +12,9 @@ from app.api.helpers.utilities import monthdelta, round_money from app.models import db from app.models.base import SoftDeletionModel -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.setting import Setting -from app.models.ticket_fee import TicketFees +from app.models.Financial_Context.ticket_fee import TicketFees from app.settings import get_settings logger = logging.getLogger(__name__) diff --git a/app/models/order.py b/app/models/Financial_Context/order.py similarity index 98% rename from app/models/order.py rename to app/models/Financial_Context/order.py index 9d21eed228..5f1b6bc9e8 100644 --- a/app/models/order.py +++ b/app/models/Financial_Context/order.py @@ -6,7 +6,7 @@ from app.api.helpers.db import get_new_identifier from app.api.helpers.storage import UPLOAD_PATHS, generate_hash from app.models import db -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.settings import get_settings diff --git a/app/models/ticket.py b/app/models/Financial_Context/ticket.py similarity index 97% rename from app/models/ticket.py rename to app/models/Financial_Context/ticket.py index 2ebd538366..ddd7b6d1bb 100644 --- a/app/models/ticket.py +++ b/app/models/Financial_Context/ticket.py @@ -3,8 +3,8 @@ from app.api.helpers.errors import ConflictError from app.models import db from app.models.base import SoftDeletionModel -from app.models.order import Order, OrderTicket -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order, OrderTicket +from app.models.Financial_Context.ticket_holder import TicketHolder access_codes_tickets = db.Table( 'access_codes_tickets', diff --git a/app/models/ticket_fee.py b/app/models/Financial_Context/ticket_fee.py similarity index 100% rename from app/models/ticket_fee.py rename to app/models/Financial_Context/ticket_fee.py diff --git a/app/models/ticket_holder.py b/app/models/Financial_Context/ticket_holder.py similarity index 100% rename from app/models/ticket_holder.py rename to app/models/Financial_Context/ticket_holder.py diff --git a/app/views/elastic_cron_helpers.py b/app/views/elastic_cron_helpers.py index d1b132257f..f203a9dea0 100644 --- a/app/views/elastic_cron_helpers.py +++ b/app/views/elastic_cron_helpers.py @@ -6,7 +6,7 @@ """ from app.api.helpers.tasks import celery -from app.models.event import Event +from app.models.Event_Context.event import Event from app.models.search.sync import rebuild_indices, sync, sync_event_from_database from app.views.elastic_search import connect_from_config from app.views.postgres import get_session_from_config diff --git a/populate_db.py b/populate_db.py index bc55fdedb0..4b2a81ba75 100644 --- a/populate_db.py +++ b/populate_db.py @@ -10,19 +10,19 @@ from app.models.custom_system_role import CustomSysRole # EventLocation -from app.models.event_location import EventLocation +from app.models.Event_Context.event_location import EventLocation # EventSubTopic -from app.models.event_sub_topic import EventSubTopic +from app.models.Event_Context.event_sub_topic import EventSubTopic # EventTopic -from app.models.event_topic import EventTopic +from app.models.Event_Context.event_topic import EventTopic # EventType -from app.models.event_type import EventType +from app.models.Event_Context.event_type import EventType from app.models.image_size import ImageSizes from app.models.message_setting import MessageSettings -from app.models.microlocation import Microlocation +from app.models.Event_Context.microlocation import Microlocation from app.models.notification import NotificationType from app.models.notification_setting import NotificationSettings @@ -33,16 +33,16 @@ # Event Role-Service Permissions from app.models.role import Role from app.models.service import Service -from app.models.session import Session +from app.models.Event_Context.session import Session from app.models.setting import Setting from app.models.speaker import Speaker -from app.models.sponsor import Sponsor +from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track from app.models.user_context.user import MODERATOR, REGISTRAR, TRACK_ORGANIZER # User Permissions from app.models.user_context.user_permission import UserPermission -from app.models.video_channel import VideoChannel +from app.models.Event_Context.video_channel import VideoChannel SALES = 'sales' ADMIN = 'admin' diff --git a/tests/all/integration/api/event_invoices/test_event_invoices_access.py b/tests/all/integration/api/event_invoices/test_event_invoices_access.py index 41f018d576..5fa0ba42f9 100644 --- a/tests/all/integration/api/event_invoices/test_event_invoices_access.py +++ b/tests/all/integration/api/event_invoices/test_event_invoices_access.py @@ -1,6 +1,6 @@ import json -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice from tests.factories.event_invoice import EventInvoiceSubFactory from tests.factories.user import UserFactory diff --git a/tests/all/integration/api/helpers/order/test_create_order.py b/tests/all/integration/api/helpers/order/test_create_order.py index be7690a521..48a67d3e01 100644 --- a/tests/all/integration/api/helpers/order/test_create_order.py +++ b/tests/all/integration/api/helpers/order/test_create_order.py @@ -1,9 +1,9 @@ import json from app.api.helpers.db import get_or_create -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.role import Role -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeFactoryBase from tests.factories.discount_code import DiscountCodeTicketSubFactory diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index b3f7bd36b1..c996de0b0a 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -1,8 +1,8 @@ import json from app.models.custom_form import CustomForms -from app.models.order import Order -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.order import Order +from app.models.Financial_Context.ticket_holder import TicketHolder from tests.factories.attendee import AttendeeSubFactory from tests.factories.event import EventFactoryBasic from tests.factories.order import OrderSubFactory diff --git a/tests/all/integration/api/helpers/test_db.py b/tests/all/integration/api/helpers/test_db.py index 4e657d3b95..d3e7a9bab0 100644 --- a/tests/all/integration/api/helpers/test_db.py +++ b/tests/all/integration/api/helpers/test_db.py @@ -11,7 +11,7 @@ save_to_db, ) from app.models.Event_Context.event import Event -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from tests.factories.attendee import AttendeeSubFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_order.py b/tests/all/integration/api/helpers/test_order.py index cb873aa693..40dd50d42b 100644 --- a/tests/all/integration/api/helpers/test_order.py +++ b/tests/all/integration/api/helpers/test_order.py @@ -5,7 +5,7 @@ from app.api.helpers.db import save_to_db from app.api.helpers.order import delete_related_attendees_for_order, set_expiry_for_order from app.models import db -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.settings import get_settings from tests.all.integration.utils import OpenEventTestCase from tests.factories import common diff --git a/tests/all/integration/api/helpers/test_query.py b/tests/all/integration/api/helpers/test_query.py index d8bb0c1359..76c3ce8ee6 100644 --- a/tests/all/integration/api/helpers/test_query.py +++ b/tests/all/integration/api/helpers/test_query.py @@ -5,9 +5,9 @@ from app.api.helpers.errors import ForbiddenError from app.api.helpers.query import event_query from app.models.Event_Context.event import Event -from app.models.order import Order +from app.models.Financial_Context.order import Order from app.models.role import Role -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_scheduled_jobs.py b/tests/all/integration/api/helpers/test_scheduled_jobs.py index 1d110a417a..7475b04347 100644 --- a/tests/all/integration/api/helpers/test_scheduled_jobs.py +++ b/tests/all/integration/api/helpers/test_scheduled_jobs.py @@ -11,7 +11,7 @@ ) from app.api.helpers.utilities import monthdelta from app.models.role import Role -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.users_events_role import UsersEventsRoles from app.settings import get_settings from tests.factories import common diff --git a/tests/all/integration/api/station/test_stations_api.py b/tests/all/integration/api/station/test_stations_api.py index 0cc5fdea92..c9b43003e3 100644 --- a/tests/all/integration/api/station/test_stations_api.py +++ b/tests/all/integration/api/station/test_stations_api.py @@ -1,6 +1,6 @@ import json -from app.models.station import Station +from app.models.Event_Context.station import Station from tests.factories.event import EventFactoryBasic from tests.factories.microlocation import MicrolocationFactory, MicrolocationSubFactory from tests.factories.station import StationFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_create_api.py b/tests/all/integration/api/video_stream/test_video_stream_create_api.py index b3f3828dd7..be4ca107bc 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_create_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_create_api.py @@ -4,7 +4,7 @@ from app.models import event from app.models.role import Role from app.models.user_context.users_events_role import UsersEventsRoles -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_stream import VideoStream from tests.factories.event import EventFactoryBasic from tests.factories.microlocation import MicrolocationSubFactory diff --git a/tests/factories/access_code.py b/tests/factories/access_code.py index 28a660ead8..74212dc8ad 100644 --- a/tests/factories/access_code.py +++ b/tests/factories/access_code.py @@ -1,6 +1,6 @@ import factory -from app.models.access_code import AccessCode +from app.models.Financial_Context.access_code import AccessCode from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/attendee.py b/tests/factories/attendee.py index c23c7f17b6..e682f44067 100644 --- a/tests/factories/attendee.py +++ b/tests/factories/attendee.py @@ -1,6 +1,6 @@ import factory -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/discount_code.py b/tests/factories/discount_code.py index 849f25ba97..48f0eb96a0 100644 --- a/tests/factories/discount_code.py +++ b/tests/factories/discount_code.py @@ -1,6 +1,6 @@ import factory -from app.models.discount_code import DiscountCode +from app.models.Financial_Context.discount_code import DiscountCode from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.ticket import TicketFactory diff --git a/tests/factories/event_invoice.py b/tests/factories/event_invoice.py index 23a1168498..f2688c9bc1 100644 --- a/tests/factories/event_invoice.py +++ b/tests/factories/event_invoice.py @@ -1,6 +1,6 @@ import factory -from app.models.event_invoice import EventInvoice +from app.models.Financial_Context.event_invoice import EventInvoice from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/order.py b/tests/factories/order.py index 574cc81e9e..9c33b66c15 100644 --- a/tests/factories/order.py +++ b/tests/factories/order.py @@ -1,6 +1,6 @@ import factory -from app.models.order import Order +from app.models.Financial_Context.order import Order from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/ticket.py b/tests/factories/ticket.py index 55911406d3..2741ee668d 100644 --- a/tests/factories/ticket.py +++ b/tests/factories/ticket.py @@ -1,6 +1,6 @@ import factory -from app.models.ticket import Ticket +from app.models.Financial_Context.ticket import Ticket from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/ticket_fee.py b/tests/factories/ticket_fee.py index fd5a3c951f..365ea320d7 100644 --- a/tests/factories/ticket_fee.py +++ b/tests/factories/ticket_fee.py @@ -1,4 +1,4 @@ -from app.models.ticket_fee import TicketFees +from app.models.Financial_Context.ticket_fee import TicketFees from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/ticket_tag.py b/tests/factories/ticket_tag.py index 3270d0f04a..89f00c4611 100644 --- a/tests/factories/ticket_tag.py +++ b/tests/factories/ticket_tag.py @@ -1,6 +1,6 @@ import factory -from app.models.ticket import TicketTag +from app.models.Financial_Context.ticket import TicketTag from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/translation_channel.py b/tests/factories/translation_channel.py index 93a150cb11..441d7014e8 100644 --- a/tests/factories/translation_channel.py +++ b/tests/factories/translation_channel.py @@ -1,6 +1,6 @@ import factory -from app.models.user_context.translation_channels import TranslationChannel +from app.models.translation_channels import TranslationChannel from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.video_stream import VideoStreamFactoryBase From f3d0d60094ce728527c25965e957ec4007401526 Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sun, 8 Dec 2024 13:46:58 -0600 Subject: [PATCH 05/17] Added Association_Context module --- app/api/admin_sales/organizer.py | 2 +- app/api/custom/check_in_stats.py | 2 +- app/api/custom/events.py | 4 ++-- app/api/custom/groups.py | 4 ++-- app/api/custom_system_roles.py | 2 +- app/api/events.py | 14 +++++++------- app/api/events_role_permission.py | 2 +- app/api/exhibitors.py | 2 +- app/api/groups.py | 4 ++-- app/api/helpers/export_helpers.py | 2 +- app/api/helpers/import_helpers.py | 4 ++-- app/api/helpers/notification.py | 2 +- app/api/helpers/permission_manager.py | 2 +- app/api/helpers/query.py | 2 +- app/api/helpers/role_invite.py | 2 +- app/api/helpers/scheduled_jobs.py | 2 +- app/api/helpers/tasks.py | 6 +++--- app/api/helpers/ticketing.py | 6 +++--- app/api/panel_permissions.py | 2 +- app/api/role_invites.py | 4 ++-- app/api/roles.py | 4 ++-- app/api/schema/event_statistics.py | 2 +- app/api/schema/exhibitors.py | 2 +- app/api/schema/role_invites.py | 4 ++-- app/api/sessions.py | 6 +++--- app/api/speaker_invites.py | 4 ++-- app/api/speakers.py | 4 ++-- app/api/station_store_paxs.py | 2 +- app/api/tags.py | 2 +- app/api/ticket_fees.py | 2 +- app/api/translation_channels.py | 2 +- app/api/user_follow_groups.py | 2 +- app/api/users.py | 4 ++-- app/api/users_events_roles.py | 2 +- app/api/users_groups_roles.py | 4 ++-- app/models/{ => Associations_Context}/group.py | 0 .../{ => Associations_Context}/panel_permission.py | 0 .../{ => Associations_Context}/permission.py | 0 app/models/{ => Associations_Context}/role.py | 0 .../{ => Associations_Context}/role_invite.py | 0 .../session_speaker_link.py | 0 app/models/{ => Associations_Context}/speaker.py | 0 .../{ => Associations_Context}/speaker_invite.py | 2 +- app/models/Event_Context/event.py | 4 ++-- app/models/{ => Event_Context}/exhibitor.py | 0 app/models/{ => Event_Context}/invite.py | 0 .../{ => Event_Context}/station_store_pax.py | 0 .../{ => Event_Context}/translation_channels.py | 0 app/models/Event_Context/video_stream.py | 2 +- app/models/custom_system_role.py | 2 +- app/models/user_context/user.py | 8 ++++---- .../api/attendee/test_attendee_access_api.py | 2 +- .../all/integration/api/event/test_event_roles.py | 4 ++-- .../api/event/test_event_view_access.py | 2 +- tests/all/integration/api/group/test_group_misc.py | 2 +- .../all/integration/api/group/test_group_roles.py | 2 +- .../integration/api/helpers/test_notification.py | 2 +- tests/all/integration/api/helpers/test_query.py | 2 +- .../integration/api/helpers/test_scheduled_jobs.py | 2 +- .../api/session/test_session_access_api.py | 2 +- .../api/session/test_session_lock_api.py | 2 +- .../api/session/test_session_state_api.py | 2 +- .../integration/api/speaker/test_speaker_api.py | 2 +- .../api/speaker/test_speaker_email_override.py | 2 +- .../api/station/test_station_store_paxs_api.py | 2 +- .../video_stream/test_video_stream_access_api.py | 2 +- .../video_stream/test_video_stream_create_api.py | 2 +- .../api/video_stream/test_video_stream_edit_api.py | 2 +- tests/factories/event_role_permission.py | 2 +- tests/factories/exhibitor.py | 2 +- tests/factories/group.py | 2 +- tests/factories/panel_permission.py | 2 +- tests/factories/role.py | 2 +- tests/factories/role_invite.py | 2 +- tests/factories/speaker.py | 2 +- tests/factories/station_store_pax.py | 2 +- tests/factories/translation_channel.py | 2 +- 77 files changed, 94 insertions(+), 94 deletions(-) rename app/models/{ => Associations_Context}/group.py (100%) rename app/models/{ => Associations_Context}/panel_permission.py (100%) rename app/models/{ => Associations_Context}/permission.py (100%) rename app/models/{ => Associations_Context}/role.py (100%) rename app/models/{ => Associations_Context}/role_invite.py (100%) rename app/models/{ => Associations_Context}/session_speaker_link.py (100%) rename app/models/{ => Associations_Context}/speaker.py (100%) rename app/models/{ => Associations_Context}/speaker_invite.py (96%) rename app/models/{ => Event_Context}/exhibitor.py (100%) rename app/models/{ => Event_Context}/invite.py (100%) rename app/models/{ => Event_Context}/station_store_pax.py (100%) rename app/models/{ => Event_Context}/translation_channels.py (100%) diff --git a/app/api/admin_sales/organizer.py b/app/api/admin_sales/organizer.py index a98521cc45..2d6133fb00 100644 --- a/app/api/admin_sales/organizer.py +++ b/app/api/admin_sales/organizer.py @@ -9,7 +9,7 @@ from app.models import db from app.models.Event_Context.event import Event from app.models.Financial_Context.order import Order, OrderTicket -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.user import User from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/custom/check_in_stats.py b/app/api/custom/check_in_stats.py index d7ee037bbd..2dcbc6352a 100644 --- a/app/api/custom/check_in_stats.py +++ b/app/api/custom/check_in_stats.py @@ -10,7 +10,7 @@ from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType from app.models.Event_Context.station import Station -from app.models.station_store_pax import StationStorePax +from app.models.Event_Context.station_store_pax import StationStorePax from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.track import Track from app.models.user_context.user_check_in import UserCheckIn diff --git a/app/api/custom/events.py b/app/api/custom/events.py index 656c906bfe..56c03e4157 100644 --- a/app/api/custom/events.py +++ b/app/api/custom/events.py @@ -14,11 +14,11 @@ from app.models import db from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor from app.models.Event_Context.microlocation import Microlocation from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Financial_Context.ticket_holder import TicketHolder events_routes = Blueprint('events_routes', __name__, url_prefix='/v1/events') diff --git a/app/api/custom/groups.py b/app/api/custom/groups.py index 71017c007f..7dd31346e0 100644 --- a/app/api/custom/groups.py +++ b/app/api/custom/groups.py @@ -11,8 +11,8 @@ from app.api.helpers.system_mails import MAILS, MailType from app.api.helpers.utilities import strip_tags from app.models.Event_Context.event import Event -from app.models.group import Group -from app.models.role import Role +from app.models.Associations_Context.group import Group +from app.models.Associations_Context.role import Role from app.models.user_context.user_follow_group import UserFollowGroup from app.models.user_context.users_groups_role import UsersGroupsRoles diff --git a/app/api/custom_system_roles.py b/app/api/custom_system_roles.py index f2e2c51b9d..c8a6553f2d 100644 --- a/app/api/custom_system_roles.py +++ b/app/api/custom_system_roles.py @@ -5,7 +5,7 @@ from app.api.schema.custom_system_roles import CustomSystemRoleSchema from app.models import db from app.models.custom_system_role import CustomSysRole -from app.models.panel_permission import PanelPermission +from app.models.Associations_Context.panel_permission import PanelPermission class CustomSystemRoleList(ResourceList): diff --git a/app/api/events.py b/app/api/events.py index c56197d4d2..31a376d7bf 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -42,20 +42,20 @@ from app.models.Event_Context.event import Event from app.models.Event_Context.event_copyright import EventCopyright from app.models.Financial_Context.event_invoice import EventInvoice -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor from app.models.faq import Faq from app.models.faq_type import FaqType from app.models.Event_Context.feedback import Feedback -from app.models.group import Group +from app.models.Associations_Context.group import Group from app.models.Event_Context.microlocation import Microlocation from app.models.Financial_Context.order import Order -from app.models.role import Role -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role import Role +from app.models.Associations_Context.role_invite import RoleInvite from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType from app.models.social_link import SocialLink -from app.models.speaker import Speaker -from app.models.speaker_invite import SpeakerInvite +from app.models.Associations_Context.speaker import Speaker +from app.models.Associations_Context.speaker_invite import SpeakerInvite from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor from app.models.stripe_authorization import StripeAuthorization @@ -73,7 +73,7 @@ ) from app.models.user_context.user_favourite_event import UserFavouriteEvent from app.models.user_context.users_events_role import UsersEventsRoles -from app.models.video_stream import VideoStream +from app.models.Event_Context.video_stream import VideoStream events_blueprint = Blueprint('events_blueprint', __name__, url_prefix='/v1/events') diff --git a/app/api/events_role_permission.py b/app/api/events_role_permission.py index df8cef4c18..4a9b7b1b08 100644 --- a/app/api/events_role_permission.py +++ b/app/api/events_role_permission.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.event_role_permissions import EventsRolePermissionSchema from app.models import db -from app.models.permission import Permission +from app.models.Associations_Context.permission import Permission class EventsRolePermissionList(ResourceList): diff --git a/app/api/exhibitors.py b/app/api/exhibitors.py index ec006e5887..0ba3e851bc 100644 --- a/app/api/exhibitors.py +++ b/app/api/exhibitors.py @@ -8,7 +8,7 @@ from app.api.helpers.utilities import changed, require_relationship from app.api.schema.exhibitors import ExhibitorSchema from app.models import db -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor from app.models.Event_Context.session import Session diff --git a/app/api/groups.py b/app/api/groups.py index 71748f60cb..427de15875 100644 --- a/app/api/groups.py +++ b/app/api/groups.py @@ -12,8 +12,8 @@ # models from app.models import db from app.models.Event_Context.event import Event -from app.models.group import Group -from app.models.role import Role +from app.models.Associations_Context.group import Group +from app.models.Associations_Context.role import Role from app.models.user_context.user import User from app.models.user_context.user_follow_group import UserFollowGroup from app.models.user_context.users_groups_role import UsersGroupsRoles diff --git a/app/api/helpers/export_helpers.py b/app/api/helpers/export_helpers.py index 2d5cb899ec..7e841aafdc 100644 --- a/app/api/helpers/export_helpers.py +++ b/app/api/helpers/export_helpers.py @@ -21,7 +21,7 @@ from app.models.Event_Context.microlocation import Microlocation from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track diff --git a/app/api/helpers/import_helpers.py b/app/api/helpers/import_helpers.py index d20c1a4677..320544fbe7 100644 --- a/app/api/helpers/import_helpers.py +++ b/app/api/helpers/import_helpers.py @@ -20,11 +20,11 @@ from app.models.Event_Context.event import Event from app.models.import_job import ImportJob from app.models.Event_Context.microlocation import Microlocation -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType from app.models.social_link import SocialLink -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track from app.models.user_context.user import User diff --git a/app/api/helpers/notification.py b/app/api/helpers/notification.py index 9ffa3d92f1..b47c48b7d0 100644 --- a/app/api/helpers/notification.py +++ b/app/api/helpers/notification.py @@ -8,7 +8,7 @@ NotificationType, ) from app.models.notification_setting import NotificationSettings -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.user_context.user import User logger = logging.getLogger(__name__) diff --git a/app/api/helpers/permission_manager.py b/app/api/helpers/permission_manager.py index 01be6e14d6..a18674f880 100644 --- a/app/api/helpers/permission_manager.py +++ b/app/api/helpers/permission_manager.py @@ -12,7 +12,7 @@ from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.user_context.user import User logger = logging.getLogger(__name__) diff --git a/app/api/helpers/query.py b/app/api/helpers/query.py index b1efe2ddc9..0f7e2fd290 100644 --- a/app/api/helpers/query.py +++ b/app/api/helpers/query.py @@ -4,7 +4,7 @@ from app.api.helpers.errors import ForbiddenError from app.api.helpers.permission_manager import has_access, is_logged_in from app.models.Event_Context.event import Event -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/helpers/role_invite.py b/app/api/helpers/role_invite.py index a27d5bdb8d..27d5e9f9c0 100644 --- a/app/api/helpers/role_invite.py +++ b/app/api/helpers/role_invite.py @@ -1,7 +1,7 @@ import logging from app.models import db -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role_invite import RoleInvite logger = logging.getLogger(__name__) diff --git a/app/api/helpers/scheduled_jobs.py b/app/api/helpers/scheduled_jobs.py index fa8e04553e..d01199bdc7 100644 --- a/app/api/helpers/scheduled_jobs.py +++ b/app/api/helpers/scheduled_jobs.py @@ -22,7 +22,7 @@ from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Financial_Context.ticket import Ticket from app.models.Financial_Context.ticket_holder import TicketHolder from app.settings import get_settings diff --git a/app/api/helpers/tasks.py b/app/api/helpers/tasks.py index f18f6af545..cffe02d634 100644 --- a/app/api/helpers/tasks.py +++ b/app/api/helpers/tasks.py @@ -44,11 +44,11 @@ from app.models.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event -from app.models.exhibitor import Exhibitor -from app.models.group import Group +from app.models.Event_Context.exhibitor import Exhibitor +from app.models.Associations_Context.group import Group from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User diff --git a/app/api/helpers/ticketing.py b/app/api/helpers/ticketing.py index 32a107d0c6..e5eeebfbe4 100644 --- a/app/api/helpers/ticketing.py +++ b/app/api/helpers/ticketing.py @@ -9,9 +9,9 @@ from app.api.helpers.order import delete_related_attendees_for_order, on_order_completed from app.api.helpers.payment import PayPalPaymentsManager, StripePaymentsManager from app.models import db -from app.models.ticket import Ticket -from app.models.ticket_fee import TicketFees -from app.models.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket import Ticket +from app.models.Financial_Context.ticket_fee import TicketFees +from app.models.Financial_Context.ticket_holder import TicketHolder logger = logging.getLogger(__name__) diff --git a/app/api/panel_permissions.py b/app/api/panel_permissions.py index cbcc7aa436..f7e05da00f 100644 --- a/app/api/panel_permissions.py +++ b/app/api/panel_permissions.py @@ -5,7 +5,7 @@ from app.api.schema.panel_permissions import PanelPermissionSchema from app.models import db from app.models.custom_system_role import CustomSysRole -from app.models.panel_permission import PanelPermission +from app.models.Associations_Context.panel_permission import PanelPermission class PanelPermissionList(ResourceList): diff --git a/app/api/role_invites.py b/app/api/role_invites.py index e5b1cdae56..f6fc13b4e5 100644 --- a/app/api/role_invites.py +++ b/app/api/role_invites.py @@ -12,8 +12,8 @@ from app.api.schema.role_invites import RoleInviteSchema from app.models import db from app.models.Event_Context.event import Event -from app.models.role import Role -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role import Role +from app.models.Associations_Context.role_invite import RoleInvite from app.models.user_context.user import User from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/roles.py b/app/api/roles.py index 6c0e0b51b7..f3be66131c 100644 --- a/app/api/roles.py +++ b/app/api/roles.py @@ -5,8 +5,8 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.schema.roles import RoleSchema from app.models import db -from app.models.role import Role -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role import Role +from app.models.Associations_Context.role_invite import RoleInvite from app.models.user_context.users_events_role import UsersEventsRoles from app.models.user_context.users_groups_role import UsersGroupsRoles diff --git a/app/api/schema/event_statistics.py b/app/api/schema/event_statistics.py index d9b0c3a7ae..c699405fad 100644 --- a/app/api/schema/event_statistics.py +++ b/app/api/schema/event_statistics.py @@ -5,7 +5,7 @@ from app.api.helpers.cache import cache from app.api.helpers.utilities import dasherize from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor diff --git a/app/api/schema/exhibitors.py b/app/api/schema/exhibitors.py index 02cc2f8216..6651278b2c 100644 --- a/app/api/schema/exhibitors.py +++ b/app/api/schema/exhibitors.py @@ -6,7 +6,7 @@ from app.api.helpers.utilities import dasherize from app.api.schema.base import TrimmedEmail -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor class ExhibitorSocialLinkSchema(Schema): diff --git a/app/api/schema/role_invites.py b/app/api/schema/role_invites.py index 05895450cf..7329d67c7d 100644 --- a/app/api/schema/role_invites.py +++ b/app/api/schema/role_invites.py @@ -7,8 +7,8 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.helpers.utilities import dasherize from app.api.schema.base import TrimmedEmail -from app.models.role import Role -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role import Role +from app.models.Associations_Context.role_invite import RoleInvite from utils.common import use_defaults diff --git a/app/api/sessions.py b/app/api/sessions.py index fc57aed9d3..2bfcbcbbce 100644 --- a/app/api/sessions.py +++ b/app/api/sessions.py @@ -23,12 +23,12 @@ from app.api.schema.sessions import SessionNotifySchema, SessionSchema from app.api.speaker_invites import SpeakerInvite from app.models import db -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor from app.models.Event_Context.microlocation import Microlocation from app.models.Event_Context.session import Session -from app.models.session_speaker_link import SessionsSpeakersLink +from app.models.Associations_Context.session_speaker_link import SessionsSpeakersLink from app.models.Event_Context.session_type import SessionType -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.track import Track from app.models.user_context.user import User diff --git a/app/api/speaker_invites.py b/app/api/speaker_invites.py index 1c124e92a6..c059bab5f6 100644 --- a/app/api/speaker_invites.py +++ b/app/api/speaker_invites.py @@ -16,8 +16,8 @@ from app.models import db from app.models.Event_Context.event import Event from app.models.Event_Context.session import Session -from app.models.speaker import Speaker -from app.models.speaker_invite import SpeakerInvite +from app.models.Associations_Context.speaker import Speaker +from app.models.Associations_Context.speaker_invite import SpeakerInvite from app.models.user_context.user import User speaker_invites_misc_routes = Blueprint( diff --git a/app/api/speakers.py b/app/api/speakers.py index db1895e45d..39d98088ea 100644 --- a/app/api/speakers.py +++ b/app/api/speakers.py @@ -14,8 +14,8 @@ from app.models import db from app.models.Event_Context.event import Event from app.models.Event_Context.session import Session -from app.models.session_speaker_link import SessionsSpeakersLink -from app.models.speaker import Speaker +from app.models.Associations_Context.session_speaker_link import SessionsSpeakersLink +from app.models.Associations_Context.speaker import Speaker from app.models.user_context.user import User diff --git a/app/api/station_store_paxs.py b/app/api/station_store_paxs.py index 58976315f1..8490e3ee4d 100644 --- a/app/api/station_store_paxs.py +++ b/app/api/station_store_paxs.py @@ -8,7 +8,7 @@ from app.models import db from app.models.Event_Context.session import Session from app.models.Event_Context.station import Station -from app.models.station_store_pax import StationStorePax +from app.models.Event_Context.station_store_pax import StationStorePax class StationStorePaxList(ResourceList): diff --git a/app/api/tags.py b/app/api/tags.py index e5f9465aaa..cb9ade853e 100644 --- a/app/api/tags.py +++ b/app/api/tags.py @@ -7,7 +7,7 @@ from app.models import db from app.models.Event_Context.event import Event from app.models.Event_Context.tag import Tag -from app.models.ticket_holder import TicketHolder +from app.models.Associations_Context.ticket_holder import TicketHolder class TagList(ResourceList): diff --git a/app/api/ticket_fees.py b/app/api/ticket_fees.py index c0c8c0dc6c..67ecd8b2d6 100644 --- a/app/api/ticket_fees.py +++ b/app/api/ticket_fees.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.ticket_fees import TicketFeesSchema from app.models import db -from app.models.ticket_fee import TicketFees +from app.models.Financial_Context.ticket_fee import TicketFees class TicketFeeList(ResourceList): diff --git a/app/api/translation_channels.py b/app/api/translation_channels.py index a67933adcb..e4343ca34c 100644 --- a/app/api/translation_channels.py +++ b/app/api/translation_channels.py @@ -7,7 +7,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.translation_channels import TranslationChannelSchema from app.models import db -from app.models.translation_channels import TranslationChannel +from app.models.Event_Context.translation_channels import TranslationChannel from app.models.Event_Context.video_channel import VideoChannel from app.models.Event_Context.video_stream import VideoStream diff --git a/app/api/user_follow_groups.py b/app/api/user_follow_groups.py index 57c5e87ef3..da9ac130d4 100644 --- a/app/api/user_follow_groups.py +++ b/app/api/user_follow_groups.py @@ -7,7 +7,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.user_follow_groups import UserFollowGroupSchema from app.models import db -from app.models.group import Group +from app.models.Associations_Context.group import Group from app.models.user_context.user import User from app.models.user_context.user_follow_group import UserFollowGroup diff --git a/app/api/users.py b/app/api/users.py index 4a679185a5..58b3d5ac93 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -25,11 +25,11 @@ from app.models.Event_Context.event import Event from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Event_Context.feedback import Feedback -from app.models.group import Group +from app.models.Associations_Context.group import Group from app.models.notification import Notification from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.models.user_context.user_follow_group import UserFollowGroup diff --git a/app/api/users_events_roles.py b/app/api/users_events_roles.py index 8692f38d0a..0b557b8ba4 100644 --- a/app/api/users_events_roles.py +++ b/app/api/users_events_roles.py @@ -5,7 +5,7 @@ from app.api.helpers.query import event_query from app.api.schema.users_events_roles import UsersEventsRolesSchema from app.models import db -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role_invite import RoleInvite from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/users_groups_roles.py b/app/api/users_groups_roles.py index e4de5c2898..8e121c2b50 100644 --- a/app/api/users_groups_roles.py +++ b/app/api/users_groups_roles.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.users_groups_roles import UsersGroupsRolesSchema from app.models import db -from app.models.group import Group -from app.models.role import Role +from app.models.Associations_Context.group import Group +from app.models.Associations_Context.role import Role from app.models.user_context.user import User from app.models.user_context.users_groups_role import UsersGroupsRoles diff --git a/app/models/group.py b/app/models/Associations_Context/group.py similarity index 100% rename from app/models/group.py rename to app/models/Associations_Context/group.py diff --git a/app/models/panel_permission.py b/app/models/Associations_Context/panel_permission.py similarity index 100% rename from app/models/panel_permission.py rename to app/models/Associations_Context/panel_permission.py diff --git a/app/models/permission.py b/app/models/Associations_Context/permission.py similarity index 100% rename from app/models/permission.py rename to app/models/Associations_Context/permission.py diff --git a/app/models/role.py b/app/models/Associations_Context/role.py similarity index 100% rename from app/models/role.py rename to app/models/Associations_Context/role.py diff --git a/app/models/role_invite.py b/app/models/Associations_Context/role_invite.py similarity index 100% rename from app/models/role_invite.py rename to app/models/Associations_Context/role_invite.py diff --git a/app/models/session_speaker_link.py b/app/models/Associations_Context/session_speaker_link.py similarity index 100% rename from app/models/session_speaker_link.py rename to app/models/Associations_Context/session_speaker_link.py diff --git a/app/models/speaker.py b/app/models/Associations_Context/speaker.py similarity index 100% rename from app/models/speaker.py rename to app/models/Associations_Context/speaker.py diff --git a/app/models/speaker_invite.py b/app/models/Associations_Context/speaker_invite.py similarity index 96% rename from app/models/speaker_invite.py rename to app/models/Associations_Context/speaker_invite.py index 578e10ca59..83794bef7f 100644 --- a/app/models/speaker_invite.py +++ b/app/models/Associations_Context/speaker_invite.py @@ -4,7 +4,7 @@ from app.models import db from app.models.helpers.timestamp import Timestamp from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.settings import get_settings diff --git a/app/models/Event_Context/event.py b/app/models/Event_Context/event.py index 16513ceec0..52529e4ce2 100644 --- a/app/models/Event_Context/event.py +++ b/app/models/Event_Context/event.py @@ -19,10 +19,10 @@ from app.models.Event_Context.feedback import Feedback from app.models.helpers.versioning import clean_html, clean_up_string from app.models.Financial_Context.order import Order -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.search import sync from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Financial_Context.ticket import Ticket from app.models.Financial_Context.ticket_fee import get_fee, get_maximum_fee from app.models.Financial_Context.ticket_holder import TicketHolder diff --git a/app/models/exhibitor.py b/app/models/Event_Context/exhibitor.py similarity index 100% rename from app/models/exhibitor.py rename to app/models/Event_Context/exhibitor.py diff --git a/app/models/invite.py b/app/models/Event_Context/invite.py similarity index 100% rename from app/models/invite.py rename to app/models/Event_Context/invite.py diff --git a/app/models/station_store_pax.py b/app/models/Event_Context/station_store_pax.py similarity index 100% rename from app/models/station_store_pax.py rename to app/models/Event_Context/station_store_pax.py diff --git a/app/models/translation_channels.py b/app/models/Event_Context/translation_channels.py similarity index 100% rename from app/models/translation_channels.py rename to app/models/Event_Context/translation_channels.py diff --git a/app/models/Event_Context/video_stream.py b/app/models/Event_Context/video_stream.py index ba74680fe8..1db019c32c 100644 --- a/app/models/Event_Context/video_stream.py +++ b/app/models/Event_Context/video_stream.py @@ -8,7 +8,7 @@ from app.models import db from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.Event_Context.video_channel import VideoChannel diff --git a/app/models/custom_system_role.py b/app/models/custom_system_role.py index 5d0a26decf..cbff5b4761 100644 --- a/app/models/custom_system_role.py +++ b/app/models/custom_system_role.py @@ -1,5 +1,5 @@ from app.models import db -from app.models.panel_permission import PanelPermission +from app.models.Associations_Context.panel_permission import PanelPermission class CustomSysRole(db.Model): diff --git a/app/models/user_context/user.py b/app/models/user_context/user.py index 370d9fa09b..7d047d7881 100644 --- a/app/models/user_context/user.py +++ b/app/models/user_context/user.py @@ -21,12 +21,12 @@ from app.models.Event_Context.event import Event from app.models.helpers.versioning import clean_html, clean_up_string from app.models.notification import Notification -from app.models.panel_permission import PanelPermission -from app.models.permission import Permission -from app.models.role import Role +from app.models.Associations_Context.panel_permission import PanelPermission +from app.models.Associations_Context.permission import Permission +from app.models.Associations_Context.role import Role from app.models.service import Service from app.models.Event_Context.session import Session -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.user_context.user_permission import UserPermission from app.models.user_context.users_events_role import UsersEventsRoles as UER diff --git a/tests/all/integration/api/attendee/test_attendee_access_api.py b/tests/all/integration/api/attendee/test_attendee_access_api.py index db6c1a6645..f20f794d23 100644 --- a/tests/all/integration/api/attendee/test_attendee_access_api.py +++ b/tests/all/integration/api/attendee/test_attendee_access_api.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderTicketSubFactory diff --git a/tests/all/integration/api/event/test_event_roles.py b/tests/all/integration/api/event/test_event_roles.py index b467fe2fac..612280e0cf 100644 --- a/tests/all/integration/api/event/test_event_roles.py +++ b/tests/all/integration/api/event/test_event_roles.py @@ -1,8 +1,8 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role import Role +from app.models.Associations_Context.role_invite import RoleInvite from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.role_invite import RoleInviteSubFactory diff --git a/tests/all/integration/api/event/test_event_view_access.py b/tests/all/integration/api/event/test_event_view_access.py index a6c2180be6..926c7e96de 100644 --- a/tests/all/integration/api/event/test_event_view_access.py +++ b/tests/all/integration/api/event/test_event_view_access.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/group/test_group_misc.py b/tests/all/integration/api/group/test_group_misc.py index 00d88171f1..9913df02a6 100644 --- a/tests/all/integration/api/group/test_group_misc.py +++ b/tests/all/integration/api/group/test_group_misc.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.group import GroupFactory diff --git a/tests/all/integration/api/group/test_group_roles.py b/tests/all/integration/api/group/test_group_roles.py index f45100c324..678599d47a 100644 --- a/tests/all/integration/api/group/test_group_roles.py +++ b/tests/all/integration/api/group/test_group_roles.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.api.helpers.permission_manager import has_access -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_groups_role import UsersGroupsRoles from tests.factories.event import EventFactoryBasic from tests.factories.group import GroupSubFactory diff --git a/tests/all/integration/api/helpers/test_notification.py b/tests/all/integration/api/helpers/test_notification.py index 7f2cb9e78c..3ca83ab123 100644 --- a/tests/all/integration/api/helpers/test_notification.py +++ b/tests/all/integration/api/helpers/test_notification.py @@ -9,7 +9,7 @@ notify_ticket_purchase_attendee, ) from app.models.notification import Notification, NotificationType -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.event_invoice import EventInvoiceSubFactory diff --git a/tests/all/integration/api/helpers/test_query.py b/tests/all/integration/api/helpers/test_query.py index 76c3ce8ee6..1325e7ef2c 100644 --- a/tests/all/integration/api/helpers/test_query.py +++ b/tests/all/integration/api/helpers/test_query.py @@ -6,7 +6,7 @@ from app.api.helpers.query import event_query from app.models.Event_Context.event import Event from app.models.Financial_Context.order import Order -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.Financial_Context.ticket import Ticket from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/test_scheduled_jobs.py b/tests/all/integration/api/helpers/test_scheduled_jobs.py index 7475b04347..9f51f070f9 100644 --- a/tests/all/integration/api/helpers/test_scheduled_jobs.py +++ b/tests/all/integration/api/helpers/test_scheduled_jobs.py @@ -10,7 +10,7 @@ this_month_date, ) from app.api.helpers.utilities import monthdelta -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.users_events_role import UsersEventsRoles from app.settings import get_settings diff --git a/tests/all/integration/api/session/test_session_access_api.py b/tests/all/integration/api/session/test_session_access_api.py index d06c153f1c..83a8342d0f 100644 --- a/tests/all/integration/api/session/test_session_access_api.py +++ b/tests/all/integration/api/session/test_session_access_api.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speaker import SpeakerSubFactory diff --git a/tests/all/integration/api/session/test_session_lock_api.py b/tests/all/integration/api/session/test_session_lock_api.py index 0ebed753c4..21a4bf770c 100644 --- a/tests/all/integration/api/session/test_session_lock_api.py +++ b/tests/all/integration/api/session/test_session_lock_api.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/session/test_session_state_api.py b/tests/all/integration/api/session/test_session_state_api.py index bc5d1ba538..81b3868e6b 100644 --- a/tests/all/integration/api/session/test_session_state_api.py +++ b/tests/all/integration/api/session/test_session_state_api.py @@ -3,7 +3,7 @@ import pytest from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/speaker/test_speaker_api.py b/tests/all/integration/api/speaker/test_speaker_api.py index 500ab18eac..579ff73c4a 100644 --- a/tests/all/integration/api/speaker/test_speaker_api.py +++ b/tests/all/integration/api/speaker/test_speaker_api.py @@ -1,7 +1,7 @@ import json from app.models.custom_form import CustomForms -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from tests.factories.speaker import SpeakerSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/speaker/test_speaker_email_override.py b/tests/all/integration/api/speaker/test_speaker_email_override.py index 47f2f7b6c4..e594866283 100644 --- a/tests/all/integration/api/speaker/test_speaker_email_override.py +++ b/tests/all/integration/api/speaker/test_speaker_email_override.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.custom_form import CustomForms -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic from tests.factories.speaker import SpeakerSubFactory diff --git a/tests/all/integration/api/station/test_station_store_paxs_api.py b/tests/all/integration/api/station/test_station_store_paxs_api.py index 04ca242e36..cde27d901a 100644 --- a/tests/all/integration/api/station/test_station_store_paxs_api.py +++ b/tests/all/integration/api/station/test_station_store_paxs_api.py @@ -1,6 +1,6 @@ import json -from app.models.station_store_pax import StationStorePax +from app.models.Event_Context.station_store_pax import StationStorePax from tests.factories.event import EventFactoryBasic from tests.factories.microlocation import MicrolocationSubFactory from tests.factories.session import SessionSubFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_access_api.py b/tests/all/integration/api/video_stream/test_video_stream_access_api.py index 67758af6c4..881a938d4d 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_access_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_access_api.py @@ -3,7 +3,7 @@ import pytest from app.api.helpers.db import get_or_create -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderSubFactory from tests.factories.microlocation import MicrolocationSubVideoStreamFactory diff --git a/tests/all/integration/api/video_stream/test_video_stream_create_api.py b/tests/all/integration/api/video_stream/test_video_stream_create_api.py index be4ca107bc..d8c9e3552c 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_create_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_create_api.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models import event -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from app.models.Event_Context.video_stream import VideoStream from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py index 44297f3a61..32cc998be4 100644 --- a/tests/all/integration/api/video_stream/test_video_stream_edit_api.py +++ b/tests/all/integration/api/video_stream/test_video_stream_edit_api.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models import event -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from app.models.Event_Context.video_stream import VideoStream from tests.factories.attendee import AttendeeOrderSubFactory diff --git a/tests/factories/event_role_permission.py b/tests/factories/event_role_permission.py index 3f42991b8c..6c844de399 100644 --- a/tests/factories/event_role_permission.py +++ b/tests/factories/event_role_permission.py @@ -1,6 +1,6 @@ import factory -from app.models.permission import Permission +from app.models.Associations_Context.permission import Permission from tests.factories.base import BaseFactory from tests.factories.role import RoleFactory from tests.factories.service import ServiceFactory diff --git a/tests/factories/exhibitor.py b/tests/factories/exhibitor.py index 6ce5511792..d0ddd69ec3 100644 --- a/tests/factories/exhibitor.py +++ b/tests/factories/exhibitor.py @@ -1,6 +1,6 @@ import factory -from app.models.exhibitor import Exhibitor +from app.models.Event_Context.exhibitor import Exhibitor from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/group.py b/tests/factories/group.py index c68c0dcfb0..cc0a2a4469 100644 --- a/tests/factories/group.py +++ b/tests/factories/group.py @@ -1,6 +1,6 @@ import factory -from app.models.group import Group +from app.models.Associations_Context.group import Group from tests.factories.base import BaseFactory from tests.factories.user import UserFactory diff --git a/tests/factories/panel_permission.py b/tests/factories/panel_permission.py index 01be5fc158..26a7667814 100644 --- a/tests/factories/panel_permission.py +++ b/tests/factories/panel_permission.py @@ -1,4 +1,4 @@ -from app.models.panel_permission import PanelPermission +from app.models.Associations_Context.panel_permission import PanelPermission from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/role.py b/tests/factories/role.py index f7dafdea7c..7d39300614 100644 --- a/tests/factories/role.py +++ b/tests/factories/role.py @@ -1,4 +1,4 @@ -from app.models.role import Role +from app.models.Associations_Context.role import Role from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/role_invite.py b/tests/factories/role_invite.py index 5d73f8e3f7..d6efd44fe6 100644 --- a/tests/factories/role_invite.py +++ b/tests/factories/role_invite.py @@ -1,6 +1,6 @@ import factory -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role_invite import RoleInvite from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/speaker.py b/tests/factories/speaker.py index ebd32ab476..9a811a8b0e 100644 --- a/tests/factories/speaker.py +++ b/tests/factories/speaker.py @@ -1,6 +1,6 @@ import factory -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/station_store_pax.py b/tests/factories/station_store_pax.py index afbca8096e..8dff92c43d 100644 --- a/tests/factories/station_store_pax.py +++ b/tests/factories/station_store_pax.py @@ -1,6 +1,6 @@ import factory -from app.models.station_store_pax import StationStorePax +from app.models.Event_Context.station_store_pax import StationStorePax from tests.factories.base import BaseFactory from tests.factories.session import SessionFactory from tests.factories.station import StationFactory diff --git a/tests/factories/translation_channel.py b/tests/factories/translation_channel.py index 441d7014e8..9b0ffea5fc 100644 --- a/tests/factories/translation_channel.py +++ b/tests/factories/translation_channel.py @@ -1,6 +1,6 @@ import factory -from app.models.translation_channels import TranslationChannel +from app.models.Event_Context.translation_channels import TranslationChannel from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.video_stream import VideoStreamFactoryBase From 176351c9edbefb64f7a1125150b457dffe725f1b Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sun, 8 Dec 2024 14:08:55 -0600 Subject: [PATCH 06/17] Added Form_Context module --- app/api/admin_statistics_api/groups.py | 2 +- app/api/admin_statistics_api/users.py | 4 ++-- app/api/badge_field_forms.py | 2 +- app/api/badge_forms.py | 4 ++-- app/api/custom/badge_forms.py | 2 +- app/api/custom/role_invites.py | 2 +- app/api/custom/tickets.py | 2 +- app/api/custom_form_options.py | 2 +- app/api/custom_form_translates.py | 2 +- app/api/custom_forms.py | 4 ++-- app/api/custom_placeholders.py | 2 +- app/api/custom_system_roles.py | 2 +- app/api/data_layers/BadgeFormLayer.py | 4 ++-- app/api/data_layers/CustomFormTranslateLayer.py | 4 ++-- app/api/data_layers/EventCopyLayer.py | 2 +- app/api/event_copy.py | 2 +- app/api/event_image_sizes.py | 2 +- app/api/events.py | 6 +++--- app/api/faq_types.py | 4 ++-- app/api/faqs.py | 4 ++-- app/api/helpers/badge_forms.py | 4 ++-- app/api/helpers/custom_forms.py | 2 +- app/api/helpers/events.py | 2 +- app/api/helpers/export_helpers.py | 2 +- app/api/helpers/files.py | 2 +- app/api/helpers/group_user_role.py | 4 ++-- app/api/helpers/import_helpers.py | 2 +- app/api/helpers/tasks.py | 6 +++--- app/api/panel_permissions.py | 2 +- app/api/speaker_image_sizes.py | 2 +- app/api/tags.py | 2 +- app/models/{ => Associations_Context}/custom_system_role.py | 0 app/models/{ => Form_Context}/badge_field_form.py | 0 app/models/{ => Form_Context}/badge_form.py | 0 app/models/{ => Form_Context}/custom_form.py | 0 app/models/{ => Form_Context}/custom_form_option.py | 0 app/models/{ => Form_Context}/custom_form_translate.py | 0 app/models/{ => Form_Context}/custom_placeholder.py | 0 app/models/{ => Form_Context}/faq.py | 0 app/models/{ => Form_Context}/faq_type.py | 0 app/models/{ => Form_Context}/image_size.py | 0 app/models/user_context/user.py | 2 +- tests/all/integration/api/attendee/test_attendee_api.py | 2 +- .../all/integration/api/badge_forms/test_badge_forms_api.py | 2 +- .../integration/api/custom_forms/test_custom_forms_api.py | 2 +- .../all/integration/api/helpers/order/test_create_order.py | 2 +- tests/all/integration/api/helpers/test_csv_jobs_util.py | 2 +- tests/all/integration/api/helpers/test_events.py | 2 +- tests/all/integration/api/session/test_session_forms_api.py | 2 +- tests/all/integration/api/speaker/test_speaker_api.py | 2 +- .../integration/api/speaker/test_speaker_email_override.py | 2 +- tests/all/integration/models/test_custom_forms.py | 2 +- tests/factories/badge_field_form.py | 2 +- tests/factories/badge_form.py | 2 +- tests/factories/custom_form.py | 2 +- tests/factories/custom_placeholder.py | 2 +- tests/factories/custom_system_role.py | 2 +- tests/factories/faq.py | 2 +- tests/factories/faq_type.py | 2 +- tests/factories/image_size.py | 2 +- tests/hook_main.py | 2 +- 61 files changed, 64 insertions(+), 64 deletions(-) rename app/models/{ => Associations_Context}/custom_system_role.py (100%) rename app/models/{ => Form_Context}/badge_field_form.py (100%) rename app/models/{ => Form_Context}/badge_form.py (100%) rename app/models/{ => Form_Context}/custom_form.py (100%) rename app/models/{ => Form_Context}/custom_form_option.py (100%) rename app/models/{ => Form_Context}/custom_form_translate.py (100%) rename app/models/{ => Form_Context}/custom_placeholder.py (100%) rename app/models/{ => Form_Context}/faq.py (100%) rename app/models/{ => Form_Context}/faq_type.py (100%) rename app/models/{ => Form_Context}/image_size.py (100%) diff --git a/app/api/admin_statistics_api/groups.py b/app/api/admin_statistics_api/groups.py index 82c924435a..292a8e9450 100644 --- a/app/api/admin_statistics_api/groups.py +++ b/app/api/admin_statistics_api/groups.py @@ -7,7 +7,7 @@ from app.api.helpers.utilities import dasherize from app.models import db from app.models.Event_Context.event import Event -from app.models.group import Group +from app.models.Associations_Context.group import Group from app.models.user_context.user_follow_group import UserFollowGroup diff --git a/app/api/admin_statistics_api/users.py b/app/api/admin_statistics_api/users.py index b2513cd12d..0daeb3916a 100644 --- a/app/api/admin_statistics_api/users.py +++ b/app/api/admin_statistics_api/users.py @@ -7,8 +7,8 @@ from app.api.helpers.db import get_count from app.api.helpers.utilities import dasherize from app.models import db -from app.models.role import Role -from app.models.ticket_holder import TicketHolder +from app.models.Associations_Context.role import Role +from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User from app.models.user_context.users_events_role import UsersEventsRoles diff --git a/app/api/badge_field_forms.py b/app/api/badge_field_forms.py index 294244c5d8..ba28338e47 100644 --- a/app/api/badge_field_forms.py +++ b/app/api/badge_field_forms.py @@ -6,7 +6,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.badge_field_forms import BadgeFieldFormSchema from app.models import db -from app.models.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms class BadgeFieldFormList(ResourceList): diff --git a/app/api/badge_forms.py b/app/api/badge_forms.py index ea1a5ac5e9..255a6588bd 100644 --- a/app/api/badge_forms.py +++ b/app/api/badge_forms.py @@ -10,8 +10,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.badge_forms import BadgeFormSchema from app.models import db -from app.models.badge_field_form import BadgeFieldForms -from app.models.badge_form import BadgeForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_form import BadgeForms from app.models.Event_Context.event import Event diff --git a/app/api/custom/badge_forms.py b/app/api/custom/badge_forms.py index 686907b19b..2a5128b247 100644 --- a/app/api/custom/badge_forms.py +++ b/app/api/custom/badge_forms.py @@ -9,7 +9,7 @@ create_export_badge_job, ) from app.api.helpers.permission_manager import has_access -from app.models.badge_form import BadgeForms +from app.models.Form_Context.badge_form import BadgeForms from app.models.Financial_Context.ticket_holder import TicketHolder badge_forms_routes = Blueprint( diff --git a/app/api/custom/role_invites.py b/app/api/custom/role_invites.py index 4afdd72b09..ab708b6add 100644 --- a/app/api/custom/role_invites.py +++ b/app/api/custom/role_invites.py @@ -1,7 +1,7 @@ from flask import Blueprint, jsonify from app.api.helpers.permissions import jwt_required -from app.models.role_invite import RoleInvite +from app.models.Associations_Context.role_invite import RoleInvite role_invites_routes = Blueprint( 'role_invites_routes', __name__, url_prefix='/v1/role-invites' diff --git a/app/api/custom/tickets.py b/app/api/custom/tickets.py index 700059d084..3364db433f 100644 --- a/app/api/custom/tickets.py +++ b/app/api/custom/tickets.py @@ -2,7 +2,7 @@ from flask_jwt_extended import jwt_required from app.api.helpers.errors import NotFoundError -from app.models.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms from app.models.Financial_Context.ticket import Ticket ticket_routes = Blueprint('ticket_routes', __name__, url_prefix='/v1/tickets') diff --git a/app/api/custom_form_options.py b/app/api/custom_form_options.py index 530a394089..56fb30a5f1 100644 --- a/app/api/custom_form_options.py +++ b/app/api/custom_form_options.py @@ -2,7 +2,7 @@ from app.api.schema.custom_form_options import CustomFormOptionSchema from app.models import db -from app.models.custom_form_option import CustomFormOptions +from app.models.Form_Context.custom_form_option import CustomFormOptions class CustomFormOptionList(ResourceList): diff --git a/app/api/custom_form_translates.py b/app/api/custom_form_translates.py index 952b97cecc..73556a4d6d 100644 --- a/app/api/custom_form_translates.py +++ b/app/api/custom_form_translates.py @@ -6,7 +6,7 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.custom_form_translates import CustomFormTranslateSchema from app.models import db -from app.models.custom_form_translate import CustomFormTranslates +from app.models.Form_Context.custom_form_translate import CustomFormTranslates class CustomFormTranslateList(ResourceList): diff --git a/app/api/custom_forms.py b/app/api/custom_forms.py index b98849d351..6f10d734cc 100644 --- a/app/api/custom_forms.py +++ b/app/api/custom_forms.py @@ -10,8 +10,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.custom_forms import CustomFormSchema from app.models import db -from app.models.custom_form import CUSTOM_FORM_IDENTIFIER_NAME_MAP, CustomForms -from app.models.custom_form_translate import CustomFormTranslates +from app.models.Form_Context.custom_form import CUSTOM_FORM_IDENTIFIER_NAME_MAP, CustomForms +from app.models.Form_Context.custom_form_translate import CustomFormTranslates from app.models.Event_Context.event import Event diff --git a/app/api/custom_placeholders.py b/app/api/custom_placeholders.py index 3208f2527c..1c0c49d73d 100644 --- a/app/api/custom_placeholders.py +++ b/app/api/custom_placeholders.py @@ -5,7 +5,7 @@ from app.api.helpers.files import create_save_image_sizes from app.api.schema.custom_placeholders import CustomPlaceholderSchema from app.models import db -from app.models.custom_placeholder import CustomPlaceholder +from app.models.Form_Context.custom_placeholder import CustomPlaceholder from app.models.Event_Context.event_sub_topic import EventSubTopic diff --git a/app/api/custom_system_roles.py b/app/api/custom_system_roles.py index c8a6553f2d..a301b833fe 100644 --- a/app/api/custom_system_roles.py +++ b/app/api/custom_system_roles.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.custom_system_roles import CustomSystemRoleSchema from app.models import db -from app.models.custom_system_role import CustomSysRole +from app.models.Form_Context.custom_system_role import CustomSysRole from app.models.Associations_Context.panel_permission import PanelPermission diff --git a/app/api/data_layers/BadgeFormLayer.py b/app/api/data_layers/BadgeFormLayer.py index 3ed1ace9b4..97d3be4e81 100644 --- a/app/api/data_layers/BadgeFormLayer.py +++ b/app/api/data_layers/BadgeFormLayer.py @@ -1,8 +1,8 @@ from flask_rest_jsonapi.data_layers.base import BaseDataLayer from app.api.helpers.db import save_to_db -from app.models.badge_field_form import BadgeFieldForms -from app.models.badge_form import BadgeForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_form import BadgeForms class BadgeFormLayer(BaseDataLayer): diff --git a/app/api/data_layers/CustomFormTranslateLayer.py b/app/api/data_layers/CustomFormTranslateLayer.py index 4ddf23da0c..5da2af8fe5 100644 --- a/app/api/data_layers/CustomFormTranslateLayer.py +++ b/app/api/data_layers/CustomFormTranslateLayer.py @@ -1,8 +1,8 @@ from flask_rest_jsonapi.data_layers.base import BaseDataLayer from app.api.helpers.db import save_to_db -from app.models.custom_form import CustomForms -from app.models.custom_form_translate import CustomFormTranslates +from app.models.Form_Context.custom_form import CustomForms +from app.models.Form_Context.custom_form_translate import CustomFormTranslates class CustomFormTranslateLayer(BaseDataLayer): diff --git a/app/api/data_layers/EventCopyLayer.py b/app/api/data_layers/EventCopyLayer.py index ca2fd1e7cc..833c49d0de 100644 --- a/app/api/data_layers/EventCopyLayer.py +++ b/app/api/data_layers/EventCopyLayer.py @@ -6,7 +6,7 @@ from app.api.helpers.db import safe_query, save_to_db from app.api.helpers.files import create_save_resized_image from app.models import db -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation diff --git a/app/api/event_copy.py b/app/api/event_copy.py index 26defc9fff..0ffa68f65e 100644 --- a/app/api/event_copy.py +++ b/app/api/event_copy.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query, save_to_db from app.api.helpers.permission_manager import has_access from app.models import db -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation diff --git a/app/api/event_image_sizes.py b/app/api/event_image_sizes.py index eca38b317f..437e4626c3 100644 --- a/app/api/event_image_sizes.py +++ b/app/api/event_image_sizes.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.image_sizes import EventImageSizeSchema from app.models import db -from app.models.image_size import ImageSizes +from app.models.Form_Context.image_size import ImageSizes class EventImageSizeDetail(ResourceDetail): diff --git a/app/api/events.py b/app/api/events.py index 31a376d7bf..5c4c059d30 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -36,15 +36,15 @@ # models from app.models import db from app.models.Financial_Context.access_code import AccessCode -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.discount_code import DiscountCode from app.models.email_notification import EmailNotification from app.models.Event_Context.event import Event from app.models.Event_Context.event_copyright import EventCopyright from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Event_Context.exhibitor import Exhibitor -from app.models.faq import Faq -from app.models.faq_type import FaqType +from app.models.Form_Context.faq import Faq +from app.models.Form_Context.faq_type import FaqType from app.models.Event_Context.feedback import Feedback from app.models.Associations_Context.group import Group from app.models.Event_Context.microlocation import Microlocation diff --git a/app/api/faq_types.py b/app/api/faq_types.py index 40479ea2e3..41ec18b388 100644 --- a/app/api/faq_types.py +++ b/app/api/faq_types.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.faq_types import FaqTypeSchema from app.models import db -from app.models.faq import Faq -from app.models.faq_type import FaqType +from app.models.Form_Context.faq import Faq +from app.models.Form_Context.faq_type import FaqType class FaqTypeListPost(ResourceList): diff --git a/app/api/faqs.py b/app/api/faqs.py index 78dc1e2799..9874499162 100644 --- a/app/api/faqs.py +++ b/app/api/faqs.py @@ -8,8 +8,8 @@ from app.api.helpers.utilities import require_relationship from app.api.schema.faqs import FaqSchema from app.models import db -from app.models.faq import Faq -from app.models.faq_type import FaqType +from app.models.Form_Context.faq import Faq +from app.models.Form_Context.faq_type import FaqType class FaqListPost(ResourceList): diff --git a/app/api/helpers/badge_forms.py b/app/api/helpers/badge_forms.py index c9c7cefdaa..6abd813bdd 100644 --- a/app/api/helpers/badge_forms.py +++ b/app/api/helpers/badge_forms.py @@ -7,8 +7,8 @@ from app.api.helpers.files import create_save_pdf from app.api.helpers.storage import UPLOAD_PATHS, generate_hash from app.api.helpers.utilities import to_snake_case -from app.models.badge_field_form import BadgeFieldForms -from app.models.custom_form import CustomForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.ticket_holder import TicketHolder diff --git a/app/api/helpers/custom_forms.py b/app/api/helpers/custom_forms.py index 64d88885a3..9c7b715a73 100644 --- a/app/api/helpers/custom_forms.py +++ b/app/api/helpers/custom_forms.py @@ -4,7 +4,7 @@ from app.api.helpers.errors import UnprocessableEntityError from app.api.schema.base import TrimmedEmail -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.ticket import Ticket diff --git a/app/api/helpers/events.py b/app/api/helpers/events.py index 7c1aa2c02d..21aba0725b 100644 --- a/app/api/helpers/events.py +++ b/app/api/helpers/events.py @@ -1,5 +1,5 @@ from app.api.helpers.db import save_to_db -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms def create_custom_forms_for_attendees(event): diff --git a/app/api/helpers/export_helpers.py b/app/api/helpers/export_helpers.py index 7e841aafdc..6f84fcdd44 100644 --- a/app/api/helpers/export_helpers.py +++ b/app/api/helpers/export_helpers.py @@ -15,7 +15,7 @@ from app.api.helpers.storage import UPLOAD_PATHS, UploadedFile, upload from app.api.helpers.utilities import get_filename_from_cd, is_downloadable from app.models import db -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Event_Context.event import Event from app.models.export_job import ExportJob from app.models.Event_Context.microlocation import Microlocation diff --git a/app/api/helpers/files.py b/app/api/helpers/files.py index 6b61fa8503..5b7e5420ef 100644 --- a/app/api/helpers/files.py +++ b/app/api/helpers/files.py @@ -15,7 +15,7 @@ from app.api.helpers.ICalExporter import ICalExporter from app.api.helpers.storage import UPLOAD_PATHS, UploadedFile, generate_hash, upload -from app.models.image_size import ImageSizes +from app.models.Form_Context.image_size import ImageSizes from app.settings import get_settings diff --git a/app/api/helpers/group_user_role.py b/app/api/helpers/group_user_role.py index 88a5f16716..fa98ce790b 100644 --- a/app/api/helpers/group_user_role.py +++ b/app/api/helpers/group_user_role.py @@ -1,5 +1,5 @@ -from app.models.group import Group -from app.models.role import Role +from app.models.Associations_Context.group import Group +from app.models.Associations_Context.role import Role from app.models.user_context.users_groups_role import UsersGroupsRoles diff --git a/app/api/helpers/import_helpers.py b/app/api/helpers/import_helpers.py index 320544fbe7..74acb4f8ac 100644 --- a/app/api/helpers/import_helpers.py +++ b/app/api/helpers/import_helpers.py @@ -16,7 +16,7 @@ from app.api.helpers.storage import UPLOAD_PATHS, UploadedFile, UploadedMemory, upload from app.api.helpers.utilities import is_downloadable, update_state, write_file from app.models import db -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Event_Context.event import Event from app.models.import_job import ImportJob from app.models.Event_Context.microlocation import Microlocation diff --git a/app/api/helpers/tasks.py b/app/api/helpers/tasks.py index cffe02d634..fa79447691 100644 --- a/app/api/helpers/tasks.py +++ b/app/api/helpers/tasks.py @@ -41,7 +41,7 @@ from app.api.imports import import_event_task_base from app.instance import create_app from app.models import db -from app.models.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms +from app.models.Form_Context.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event from app.models.Event_Context.exhibitor import Exhibitor @@ -55,8 +55,8 @@ from app.models.user_context.user_follow_group import UserFollowGroup from app.settings import get_settings -from ...models.badge_field_form import BadgeFieldForms -from ...models.badge_form import BadgeForms +from ...models.Form_Context.badge_field_form import BadgeFieldForms +from ...models.Form_Context.badge_form import BadgeForms from .badge_forms import ( create_base64_img_qr, get_value_from_field_indentifier, diff --git a/app/api/panel_permissions.py b/app/api/panel_permissions.py index f7e05da00f..d7ec684b8b 100644 --- a/app/api/panel_permissions.py +++ b/app/api/panel_permissions.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.panel_permissions import PanelPermissionSchema from app.models import db -from app.models.custom_system_role import CustomSysRole +from app.models.Associations_Context.custom_system_role import CustomSysRole from app.models.Associations_Context.panel_permission import PanelPermission diff --git a/app/api/speaker_image_sizes.py b/app/api/speaker_image_sizes.py index 24544dc6a2..56b47de322 100644 --- a/app/api/speaker_image_sizes.py +++ b/app/api/speaker_image_sizes.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.image_sizes import SpeakerImageSizeSchema from app.models import db -from app.models.image_size import ImageSizes +from app.models.Form_Context.image_size import ImageSizes class SpeakerImageSizeDetail(ResourceDetail): diff --git a/app/api/tags.py b/app/api/tags.py index cb9ade853e..8aaee207dd 100644 --- a/app/api/tags.py +++ b/app/api/tags.py @@ -7,7 +7,7 @@ from app.models import db from app.models.Event_Context.event import Event from app.models.Event_Context.tag import Tag -from app.models.Associations_Context.ticket_holder import TicketHolder +from app.models.Financial_Context.ticket_holder import TicketHolder class TagList(ResourceList): diff --git a/app/models/custom_system_role.py b/app/models/Associations_Context/custom_system_role.py similarity index 100% rename from app/models/custom_system_role.py rename to app/models/Associations_Context/custom_system_role.py diff --git a/app/models/badge_field_form.py b/app/models/Form_Context/badge_field_form.py similarity index 100% rename from app/models/badge_field_form.py rename to app/models/Form_Context/badge_field_form.py diff --git a/app/models/badge_form.py b/app/models/Form_Context/badge_form.py similarity index 100% rename from app/models/badge_form.py rename to app/models/Form_Context/badge_form.py diff --git a/app/models/custom_form.py b/app/models/Form_Context/custom_form.py similarity index 100% rename from app/models/custom_form.py rename to app/models/Form_Context/custom_form.py diff --git a/app/models/custom_form_option.py b/app/models/Form_Context/custom_form_option.py similarity index 100% rename from app/models/custom_form_option.py rename to app/models/Form_Context/custom_form_option.py diff --git a/app/models/custom_form_translate.py b/app/models/Form_Context/custom_form_translate.py similarity index 100% rename from app/models/custom_form_translate.py rename to app/models/Form_Context/custom_form_translate.py diff --git a/app/models/custom_placeholder.py b/app/models/Form_Context/custom_placeholder.py similarity index 100% rename from app/models/custom_placeholder.py rename to app/models/Form_Context/custom_placeholder.py diff --git a/app/models/faq.py b/app/models/Form_Context/faq.py similarity index 100% rename from app/models/faq.py rename to app/models/Form_Context/faq.py diff --git a/app/models/faq_type.py b/app/models/Form_Context/faq_type.py similarity index 100% rename from app/models/faq_type.py rename to app/models/Form_Context/faq_type.py diff --git a/app/models/image_size.py b/app/models/Form_Context/image_size.py similarity index 100% rename from app/models/image_size.py rename to app/models/Form_Context/image_size.py diff --git a/app/models/user_context/user.py b/app/models/user_context/user.py index 7d047d7881..745173db49 100644 --- a/app/models/user_context/user.py +++ b/app/models/user_context/user.py @@ -17,7 +17,7 @@ from app.api.helpers.utilities import get_serializer from app.models import db from app.models.base import SoftDeletionModel -from app.models.custom_system_role import UserSystemRole +from app.models.Associations_Context.custom_system_role import UserSystemRole from app.models.Event_Context.event import Event from app.models.helpers.versioning import clean_html, clean_up_string from app.models.notification import Notification diff --git a/tests/all/integration/api/attendee/test_attendee_api.py b/tests/all/integration/api/attendee/test_attendee_api.py index 657d3b9816..518a9aafba 100644 --- a/tests/all/integration/api/attendee/test_attendee_api.py +++ b/tests/all/integration/api/attendee/test_attendee_api.py @@ -1,6 +1,6 @@ import json -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from tests.factories.attendee import AttendeeOrderTicketSubFactory from tests.factories.order import OrderSubFactory from tests.factories.ticket import TicketSubFactory diff --git a/tests/all/integration/api/badge_forms/test_badge_forms_api.py b/tests/all/integration/api/badge_forms/test_badge_forms_api.py index c407b02d62..abecb492d1 100644 --- a/tests/all/integration/api/badge_forms/test_badge_forms_api.py +++ b/tests/all/integration/api/badge_forms/test_badge_forms_api.py @@ -1,6 +1,6 @@ import json -from app.models.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms from tests.factories import common from tests.factories.badge_field_form import BadgeFieldFormFactory from tests.factories.badge_form import BadgeFormFactory diff --git a/tests/all/integration/api/custom_forms/test_custom_forms_api.py b/tests/all/integration/api/custom_forms/test_custom_forms_api.py index 520d1cf01c..7a00034ec7 100644 --- a/tests/all/integration/api/custom_forms/test_custom_forms_api.py +++ b/tests/all/integration/api/custom_forms/test_custom_forms_api.py @@ -1,6 +1,6 @@ import json -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/helpers/order/test_create_order.py b/tests/all/integration/api/helpers/order/test_create_order.py index 48a67d3e01..3096342de5 100644 --- a/tests/all/integration/api/helpers/order/test_create_order.py +++ b/tests/all/integration/api/helpers/order/test_create_order.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_or_create from app.models.Financial_Context.order import Order -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeFactoryBase diff --git a/tests/all/integration/api/helpers/test_csv_jobs_util.py b/tests/all/integration/api/helpers/test_csv_jobs_util.py index a567bcbc4b..bc8f28485d 100644 --- a/tests/all/integration/api/helpers/test_csv_jobs_util.py +++ b/tests/all/integration/api/helpers/test_csv_jobs_util.py @@ -10,7 +10,7 @@ export_speakers_csv, ) from app.models import db -from app.models.custom_form import ATTENDEE_CUSTOM_FORM +from app.models.Form_Context.custom_form import ATTENDEE_CUSTOM_FORM from tests.all.integration.auth_helper import create_user from tests.all.integration.utils import OpenEventTestCase from tests.factories import common diff --git a/tests/all/integration/api/helpers/test_events.py b/tests/all/integration/api/helpers/test_events.py index 49b211a85b..af274d57f9 100644 --- a/tests/all/integration/api/helpers/test_events.py +++ b/tests/all/integration/api/helpers/test_events.py @@ -2,7 +2,7 @@ from app.api.helpers.db import get_count, save_to_db from app.api.helpers.events import create_custom_forms_for_attendees -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from tests.all.integration.utils import OpenEventTestCase from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/api/session/test_session_forms_api.py b/tests/all/integration/api/session/test_session_forms_api.py index 3336ba4d71..9114b3ef5a 100644 --- a/tests/all/integration/api/session/test_session_forms_api.py +++ b/tests/all/integration/api/session/test_session_forms_api.py @@ -1,6 +1,6 @@ import json -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Event_Context.session import Session from tests.factories.session import SessionSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/speaker/test_speaker_api.py b/tests/all/integration/api/speaker/test_speaker_api.py index 579ff73c4a..282ddc990f 100644 --- a/tests/all/integration/api/speaker/test_speaker_api.py +++ b/tests/all/integration/api/speaker/test_speaker_api.py @@ -1,6 +1,6 @@ import json -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Associations_Context.speaker import Speaker from tests.factories.speaker import SpeakerSubFactory from tests.factories.speakers_call import SpeakersCallSubFactory diff --git a/tests/all/integration/api/speaker/test_speaker_email_override.py b/tests/all/integration/api/speaker/test_speaker_email_override.py index e594866283..46838334fc 100644 --- a/tests/all/integration/api/speaker/test_speaker_email_override.py +++ b/tests/all/integration/api/speaker/test_speaker_email_override.py @@ -1,7 +1,7 @@ import json from app.api.helpers.db import get_or_create -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.event import EventFactoryBasic diff --git a/tests/all/integration/models/test_custom_forms.py b/tests/all/integration/models/test_custom_forms.py index 03f1ccc228..ba506def0d 100644 --- a/tests/all/integration/models/test_custom_forms.py +++ b/tests/all/integration/models/test_custom_forms.py @@ -1,4 +1,4 @@ -from app.models.custom_form import CustomForms, assign_field_names +from app.models.Form_Context.custom_form import CustomForms, assign_field_names from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/badge_field_form.py b/tests/factories/badge_field_form.py index 8a97af4a42..7ef05c64e0 100644 --- a/tests/factories/badge_field_form.py +++ b/tests/factories/badge_field_form.py @@ -1,6 +1,6 @@ import factory -from app.models.badge_field_form import BadgeFieldForms +from app.models.Form_Context.badge_field_form import BadgeFieldForms from tests.factories import common from tests.factories.badge_form import BadgeFormFactory from tests.factories.base import BaseFactory diff --git a/tests/factories/badge_form.py b/tests/factories/badge_form.py index 8ed76c2d92..79ae8440b5 100644 --- a/tests/factories/badge_form.py +++ b/tests/factories/badge_form.py @@ -1,6 +1,6 @@ import factory -from app.models.badge_form import BadgeForms +from app.models.Form_Context.badge_form import BadgeForms from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/custom_form.py b/tests/factories/custom_form.py index 4c4935fcff..34f38a58b6 100644 --- a/tests/factories/custom_form.py +++ b/tests/factories/custom_form.py @@ -1,6 +1,6 @@ import factory -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/custom_placeholder.py b/tests/factories/custom_placeholder.py index 01c496ee18..21bc0c4ea7 100644 --- a/tests/factories/custom_placeholder.py +++ b/tests/factories/custom_placeholder.py @@ -1,4 +1,4 @@ -from app.models.custom_placeholder import CustomPlaceholder +from app.models.Form_Context.custom_placeholder import CustomPlaceholder from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/custom_system_role.py b/tests/factories/custom_system_role.py index 864fc9ee16..c73c8c223b 100644 --- a/tests/factories/custom_system_role.py +++ b/tests/factories/custom_system_role.py @@ -1,4 +1,4 @@ -from app.models.custom_system_role import CustomSysRole +from app.models.Form_Context.custom_system_role import CustomSysRole from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/faq.py b/tests/factories/faq.py index bf20a8151a..468cb6dc8e 100644 --- a/tests/factories/faq.py +++ b/tests/factories/faq.py @@ -1,6 +1,6 @@ import factory -from app.models.faq import Faq +from app.models.Form_Context.faq import Faq from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic from tests.factories.faq_type import FaqTypeFactory diff --git a/tests/factories/faq_type.py b/tests/factories/faq_type.py index 85e67a49bd..22959d67d0 100644 --- a/tests/factories/faq_type.py +++ b/tests/factories/faq_type.py @@ -1,6 +1,6 @@ import factory -from app.models.faq_type import FaqType +from app.models.Form_Context.faq_type import FaqType from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/image_size.py b/tests/factories/image_size.py index ba8237d7a5..c17274aa32 100644 --- a/tests/factories/image_size.py +++ b/tests/factories/image_size.py @@ -1,4 +1,4 @@ -from app.models.image_size import ImageSizes +from app.models.Form_Context.image_size import ImageSizes from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/hook_main.py b/tests/hook_main.py index 41c4aebcf4..6887aa8a5f 100644 --- a/tests/hook_main.py +++ b/tests/hook_main.py @@ -11,7 +11,7 @@ from flask_migrate import Migrate from flask import Flask from app.models import db -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.user_context.user_token_blacklist import ( # noqa UserTokenBlackListTime, ) # Workaround for registering unimported model From be03834587858ddf675291afe54de1dcc6adc290 Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sun, 8 Dec 2024 14:28:38 -0600 Subject: [PATCH 07/17] Added Communiciation_Context module --- app/api/admin_statistics_api/mails.py | 2 +- app/api/custom_system_roles.py | 2 +- app/api/data_layers/EventCopyLayer.py | 2 +- app/api/email_notifications.py | 2 +- app/api/event_copy.py | 2 +- app/api/events.py | 6 +++--- app/api/helpers/import_helpers.py | 2 +- app/api/helpers/mail.py | 4 ++-- app/api/helpers/notification.py | 2 +- app/api/helpers/payment.py | 2 +- app/api/mails.py | 2 +- app/api/message_settings.py | 2 +- app/api/notification_settings.py | 2 +- app/api/notifications.py | 2 +- app/api/stripe_authorization.py | 2 +- app/api/users.py | 4 ++-- .../email_notification.py | 0 app/models/{ => Communication_Context}/mail.py | 0 .../message_setting.py | 0 .../{ => Communication_Context}/notification.py | 0 .../notification_setting.py | 0 .../{ => Communication_Context}/social_link.py | 0 app/models/Event_Context/event.py | 2 +- .../stripe_authorization.py | 0 populate_db.py | 16 ++++++++-------- .../api/helpers/order/test_edit_order.py | 2 +- .../integration/api/helpers/test_notification.py | 2 +- tests/factories/custom_system_role.py | 2 +- tests/factories/mail.py | 2 +- tests/factories/message_setting.py | 2 +- tests/factories/notification.py | 2 +- tests/factories/social_link.py | 2 +- tests/factories/stripe_authorization.py | 2 +- 33 files changed, 37 insertions(+), 37 deletions(-) rename app/models/{ => Communication_Context}/email_notification.py (100%) rename app/models/{ => Communication_Context}/mail.py (100%) rename app/models/{ => Communication_Context}/message_setting.py (100%) rename app/models/{ => Communication_Context}/notification.py (100%) rename app/models/{ => Communication_Context}/notification_setting.py (100%) rename app/models/{ => Communication_Context}/social_link.py (100%) rename app/models/{ => Financial_Context}/stripe_authorization.py (100%) diff --git a/app/api/admin_statistics_api/mails.py b/app/api/admin_statistics_api/mails.py index 5d60879ff1..6e46dfe49c 100644 --- a/app/api/admin_statistics_api/mails.py +++ b/app/api/admin_statistics_api/mails.py @@ -9,7 +9,7 @@ from app.api.data_layers.NoModelLayer import NoModelLayer from app.api.helpers.utilities import dasherize from app.models import db -from app.models.mail import Mail +from app.models.Communication_Context.mail import Mail class AdminStatisticsMailSchema(Schema): diff --git a/app/api/custom_system_roles.py b/app/api/custom_system_roles.py index a301b833fe..5aa252a966 100644 --- a/app/api/custom_system_roles.py +++ b/app/api/custom_system_roles.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.custom_system_roles import CustomSystemRoleSchema from app.models import db -from app.models.Form_Context.custom_system_role import CustomSysRole +from app.models.Associations_Context.custom_system_role import CustomSysRole from app.models.Associations_Context.panel_permission import PanelPermission diff --git a/app/api/data_layers/EventCopyLayer.py b/app/api/data_layers/EventCopyLayer.py index 833c49d0de..925bb89dfe 100644 --- a/app/api/data_layers/EventCopyLayer.py +++ b/app/api/data_layers/EventCopyLayer.py @@ -10,7 +10,7 @@ from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation -from app.models.social_link import SocialLink +from app.models.Communication_Context.social_link import SocialLink from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor from app.models.Financial_Context.ticket import Ticket diff --git a/app/api/email_notifications.py b/app/api/email_notifications.py index a997493d99..ac38262128 100644 --- a/app/api/email_notifications.py +++ b/app/api/email_notifications.py @@ -5,7 +5,7 @@ from app.api.helpers.permissions import jwt_required from app.api.schema.email_notifications import EmailNotificationSchema from app.models import db -from app.models.email_notification import EmailNotification +from app.models.Communication_Context.email_notification import EmailNotification from app.models.user_context.user import User diff --git a/app/api/event_copy.py b/app/api/event_copy.py index 0ffa68f65e..ff45062d19 100644 --- a/app/api/event_copy.py +++ b/app/api/event_copy.py @@ -8,7 +8,7 @@ from app.models.Financial_Context.discount_code import DiscountCode from app.models.Event_Context.event import Event, get_new_event_identifier from app.models.Event_Context.microlocation import Microlocation -from app.models.social_link import SocialLink +from app.models.Communication_Context.social_link import SocialLink from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor from app.models.Event_Context.tax import Tax diff --git a/app/api/events.py b/app/api/events.py index 5c4c059d30..b90c8b63c9 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -38,7 +38,7 @@ from app.models.Financial_Context.access_code import AccessCode from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.discount_code import DiscountCode -from app.models.email_notification import EmailNotification +from app.models.Communication_Context.email_notification import EmailNotification from app.models.Event_Context.event import Event from app.models.Event_Context.event_copyright import EventCopyright from app.models.Financial_Context.event_invoice import EventInvoice @@ -53,12 +53,12 @@ from app.models.Associations_Context.role_invite import RoleInvite from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType -from app.models.social_link import SocialLink +from app.models.Communication_Context.social_link import SocialLink from app.models.Associations_Context.speaker import Speaker from app.models.Associations_Context.speaker_invite import SpeakerInvite from app.models.Event_Context.speakers_call import SpeakersCall from app.models.Event_Context.sponsor import Sponsor -from app.models.stripe_authorization import StripeAuthorization +from app.models.Financial_Context.stripe_authorization import StripeAuthorization from app.models.Event_Context.tax import Tax from app.models.Financial_Context.ticket import Ticket, TicketTag from app.models.Financial_Context.ticket_holder import TicketHolder diff --git a/app/api/helpers/import_helpers.py b/app/api/helpers/import_helpers.py index 74acb4f8ac..9c9470c503 100644 --- a/app/api/helpers/import_helpers.py +++ b/app/api/helpers/import_helpers.py @@ -23,7 +23,7 @@ from app.models.Associations_Context.role import Role from app.models.Event_Context.session import Session from app.models.Event_Context.session_type import SessionType -from app.models.social_link import SocialLink +from app.models.Communication_Context.social_link import SocialLink from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track diff --git a/app/api/helpers/mail.py b/app/api/helpers/mail.py index 984bdc34db..c0cea40da3 100644 --- a/app/api/helpers/mail.py +++ b/app/api/helpers/mail.py @@ -17,8 +17,8 @@ from app.api.helpers.system_mails import MAILS, MailType from app.api.helpers.utilities import get_serializer, str_generator, string_empty from app.models.Event_Context.event import Event -from app.models.mail import Mail -from app.models.message_setting import MessageSettings +from app.models.Communication_Context.mail import Mail +from app.models.Communication_Context.message_setting import MessageSettings from app.models.Financial_Context.order import OrderTicket from app.models.Financial_Context.ticket_holder import TicketHolder from app.models.user_context.user import User diff --git a/app/api/helpers/notification.py b/app/api/helpers/notification.py index b47c48b7d0..1aac03cc03 100644 --- a/app/api/helpers/notification.py +++ b/app/api/helpers/notification.py @@ -7,7 +7,7 @@ NotificationContent, NotificationType, ) -from app.models.notification_setting import NotificationSettings +from app.models.Communication_Context.notification_setting import NotificationSettings from app.models.Associations_Context.speaker import Speaker from app.models.user_context.user import User diff --git a/app/api/helpers/payment.py b/app/api/helpers/payment.py index 85db1dfcbd..98c031fd65 100644 --- a/app/api/helpers/payment.py +++ b/app/api/helpers/payment.py @@ -12,7 +12,7 @@ from app.api.helpers.errors import ConflictError, ForbiddenError from app.api.helpers.utilities import represents_int, round_money from app.models.Financial_Context.order import Order -from app.models.stripe_authorization import StripeAuthorization +from app.models.Financial_Context.stripe_authorization import StripeAuthorization from app.settings import Environment, get_settings diff --git a/app/api/mails.py b/app/api/mails.py index 2e867a9ed7..4743b70324 100644 --- a/app/api/mails.py +++ b/app/api/mails.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.mails import MailSchema from app.models import db -from app.models.mail import Mail +from app.models.Communication_Context.mail import Mail class MailList(ResourceList): diff --git a/app/api/message_settings.py b/app/api/message_settings.py index 6ec205edb7..2cc69fdca8 100644 --- a/app/api/message_settings.py +++ b/app/api/message_settings.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.message_settings import MessageSettingSchema from app.models import db -from app.models.message_setting import MessageSettings +from app.models.Communication_Context.message_setting import MessageSettings class MessageSettingsList(ResourceList): diff --git a/app/api/notification_settings.py b/app/api/notification_settings.py index ef09990ac7..8f2bb76d5f 100644 --- a/app/api/notification_settings.py +++ b/app/api/notification_settings.py @@ -3,7 +3,7 @@ from app.api.bootstrap import api from app.api.schema.notification_settings import NotificationSettingSchema from app.models import db -from app.models.notification_setting import NotificationSettings +from app.models.Communication_Context.notification_setting import NotificationSettings class NotificationSettingsList(ResourceList): diff --git a/app/api/notifications.py b/app/api/notifications.py index 4bba4d2ebe..1c2f94bdcf 100644 --- a/app/api/notifications.py +++ b/app/api/notifications.py @@ -4,7 +4,7 @@ from app.api.helpers.db import safe_query_kwargs from app.api.schema.notifications import NotificationSchema from app.models import db -from app.models.notification import Notification +from app.models.Communication_Context.notification import Notification from app.models.user_context.user import User diff --git a/app/api/stripe_authorization.py b/app/api/stripe_authorization.py index 59d7f16bdb..84b7800f3b 100644 --- a/app/api/stripe_authorization.py +++ b/app/api/stripe_authorization.py @@ -14,7 +14,7 @@ ) from app.models import db from app.models.Event_Context.event import Event -from app.models.stripe_authorization import StripeAuthorization +from app.models.Financial_Context.stripe_authorization import StripeAuthorization class StripeAuthorizationListPost(ResourceList): diff --git a/app/api/users.py b/app/api/users.py index 58b3d5ac93..9ecff8833c 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -21,12 +21,12 @@ from app.models import db from app.models.Financial_Context.access_code import AccessCode from app.models.Financial_Context.discount_code import DiscountCode -from app.models.email_notification import EmailNotification +from app.models.Communication_Context.email_notification import EmailNotification from app.models.Event_Context.event import Event from app.models.Financial_Context.event_invoice import EventInvoice from app.models.Event_Context.feedback import Feedback from app.models.Associations_Context.group import Group -from app.models.notification import Notification +from app.models.Communication_Context.notification import Notification from app.models.Financial_Context.order import Order from app.models.Event_Context.session import Session from app.models.Associations_Context.speaker import Speaker diff --git a/app/models/email_notification.py b/app/models/Communication_Context/email_notification.py similarity index 100% rename from app/models/email_notification.py rename to app/models/Communication_Context/email_notification.py diff --git a/app/models/mail.py b/app/models/Communication_Context/mail.py similarity index 100% rename from app/models/mail.py rename to app/models/Communication_Context/mail.py diff --git a/app/models/message_setting.py b/app/models/Communication_Context/message_setting.py similarity index 100% rename from app/models/message_setting.py rename to app/models/Communication_Context/message_setting.py diff --git a/app/models/notification.py b/app/models/Communication_Context/notification.py similarity index 100% rename from app/models/notification.py rename to app/models/Communication_Context/notification.py diff --git a/app/models/notification_setting.py b/app/models/Communication_Context/notification_setting.py similarity index 100% rename from app/models/notification_setting.py rename to app/models/Communication_Context/notification_setting.py diff --git a/app/models/social_link.py b/app/models/Communication_Context/social_link.py similarity index 100% rename from app/models/social_link.py rename to app/models/Communication_Context/social_link.py diff --git a/app/models/Event_Context/event.py b/app/models/Event_Context/event.py index 52529e4ce2..3e6e7ae232 100644 --- a/app/models/Event_Context/event.py +++ b/app/models/Event_Context/event.py @@ -14,7 +14,7 @@ from app.api.helpers.db import get_new_identifier from app.models import db from app.models.base import SoftDeletionModel -from app.models.email_notification import EmailNotification +from app.models.Communication_Context.email_notification import EmailNotification from app.models.Event_Context.event_topic import EventTopic from app.models.Event_Context.feedback import Feedback from app.models.helpers.versioning import clean_html, clean_up_string diff --git a/app/models/stripe_authorization.py b/app/models/Financial_Context/stripe_authorization.py similarity index 100% rename from app/models/stripe_authorization.py rename to app/models/Financial_Context/stripe_authorization.py diff --git a/populate_db.py b/populate_db.py index 4b2a81ba75..daf7efc63f 100644 --- a/populate_db.py +++ b/populate_db.py @@ -20,22 +20,22 @@ # EventType from app.models.Event_Context.event_type import EventType -from app.models.image_size import ImageSizes -from app.models.message_setting import MessageSettings +from app.models.Form_Context.image_size import ImageSizes +from app.models.Communication_Context.message_setting import MessageSettings from app.models.Event_Context.microlocation import Microlocation -from app.models.notification import NotificationType -from app.models.notification_setting import NotificationSettings +from app.models.Communication_Context.notification import NotificationType +from app.models.Communication_Context.notification_setting import NotificationSettings # Admin Panel Permissions -from app.models.panel_permission import PanelPermission -from app.models.permission import Permission +from app.models.Associations_Context.panel_permission import PanelPermission +from app.models.Associations_Context.permission import Permission # Event Role-Service Permissions -from app.models.role import Role +from app.models.Associations_Context.role import Role from app.models.service import Service from app.models.Event_Context.session import Session from app.models.setting import Setting -from app.models.speaker import Speaker +from app.models.Associations_Context.speaker import Speaker from app.models.Event_Context.sponsor import Sponsor from app.models.track import Track from app.models.user_context.user import MODERATOR, REGISTRAR, TRACK_ORGANIZER diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index c996de0b0a..2067e96513 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -1,6 +1,6 @@ import json -from app.models.custom_form import CustomForms +from app.models.Form_Context.custom_form import CustomForms from app.models.Financial_Context.order import Order from app.models.Financial_Context.ticket_holder import TicketHolder from tests.factories.attendee import AttendeeSubFactory diff --git a/tests/all/integration/api/helpers/test_notification.py b/tests/all/integration/api/helpers/test_notification.py index 3ca83ab123..4563993999 100644 --- a/tests/all/integration/api/helpers/test_notification.py +++ b/tests/all/integration/api/helpers/test_notification.py @@ -8,7 +8,7 @@ notify_session_state_change, notify_ticket_purchase_attendee, ) -from app.models.notification import Notification, NotificationType +from app.models.Communication_Context.notification import Notification, NotificationType from app.models.Associations_Context.role import Role from app.models.user_context.users_events_role import UsersEventsRoles from tests.factories.attendee import AttendeeOrderSubFactory diff --git a/tests/factories/custom_system_role.py b/tests/factories/custom_system_role.py index c73c8c223b..6fbcdc86d0 100644 --- a/tests/factories/custom_system_role.py +++ b/tests/factories/custom_system_role.py @@ -1,4 +1,4 @@ -from app.models.Form_Context.custom_system_role import CustomSysRole +from app.models.Associations_Context.custom_system_role import CustomSysRole from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/mail.py b/tests/factories/mail.py index e299105c97..8511e45f42 100644 --- a/tests/factories/mail.py +++ b/tests/factories/mail.py @@ -1,4 +1,4 @@ -from app.models.mail import Mail +from app.models.Communication_Context.mail import Mail from tests.factories import common from tests.factories.base import BaseFactory diff --git a/tests/factories/message_setting.py b/tests/factories/message_setting.py index f4ae92b250..694e7a2935 100644 --- a/tests/factories/message_setting.py +++ b/tests/factories/message_setting.py @@ -1,5 +1,5 @@ from app.api.helpers.system_mails import MailType -from app.models.message_setting import MessageSettings +from app.models.Communication_Context.message_setting import MessageSettings from tests.factories.base import BaseFactory diff --git a/tests/factories/notification.py b/tests/factories/notification.py index 9821b64d54..d3dac1edca 100644 --- a/tests/factories/notification.py +++ b/tests/factories/notification.py @@ -1,6 +1,6 @@ import factory -from app.models.notification import Notification, NotificationActor, NotificationContent +from app.models.Communication_Context.notification import Notification, NotificationActor, NotificationContent from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/social_link.py b/tests/factories/social_link.py index 3d853932de..1a1211e690 100644 --- a/tests/factories/social_link.py +++ b/tests/factories/social_link.py @@ -1,6 +1,6 @@ import factory -from app.models.social_link import SocialLink +from app.models.Communication_Context.social_link import SocialLink from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic diff --git a/tests/factories/stripe_authorization.py b/tests/factories/stripe_authorization.py index b610792c47..5545e726bf 100644 --- a/tests/factories/stripe_authorization.py +++ b/tests/factories/stripe_authorization.py @@ -1,6 +1,6 @@ import factory -from app.models.stripe_authorization import StripeAuthorization +from app.models.Financial_Context.stripe_authorization import StripeAuthorization from tests.factories import common from tests.factories.base import BaseFactory from tests.factories.event import EventFactoryBasic From b72aeb00e769d919921f51268b3f68989c78f015 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:42:39 -0500 Subject: [PATCH 08/17] Update email_notification.py --- app/models/Communication_Context/email_notification.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/Communication_Context/email_notification.py b/app/models/Communication_Context/email_notification.py index c97a1cc72a..492ddd4048 100644 --- a/app/models/Communication_Context/email_notification.py +++ b/app/models/Communication_Context/email_notification.py @@ -1,7 +1,8 @@ from app.models import db from app.models.base import SoftDeletionModel - +# Email notifaction preferences for a user assoicated with a specific event. +# This model allows users to enable or disable specific types of notifcations. class EmailNotification(SoftDeletionModel): """email notifications model class""" From 2a7805e63c959161b9931945c5da0b03c8363677 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:48:46 -0500 Subject: [PATCH 09/17] Update discounted.py --- app/api/admin_sales/discounted.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/api/admin_sales/discounted.py b/app/api/admin_sales/discounted.py index a1e516f2c2..7bbf257c7b 100644 --- a/app/api/admin_sales/discounted.py +++ b/app/api/admin_sales/discounted.py @@ -13,6 +13,10 @@ def sales_per_marketer_and_discount_by_status(status): + """ + Generates a Common Table Expression (CTE) that calculates sales and ticket quantities + per marketer and discount code for a specific order status. + """ return ( db.session.query( Event.id.label('event_id'), From bee02d7d7a03299c96565e6e9fd84dec7ea75876 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:53:05 -0500 Subject: [PATCH 10/17] Update locations.py --- app/api/admin_sales/locations.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/api/admin_sales/locations.py b/app/api/admin_sales/locations.py index eab81d0ccf..02354b1846 100644 --- a/app/api/admin_sales/locations.py +++ b/app/api/admin_sales/locations.py @@ -11,6 +11,11 @@ def sales_per_location_by_status(status): + """ + Generates a Common Table Expression (CTE) that calculates sales and ticket quantities + grouped by event location for a specific order status. + """ + return ( db.session.query( Event.location_name.label('location'), From d95ef998deca241d4ec960fcde3633bde870df5a Mon Sep 17 00:00:00 2001 From: Cole Boltjes Date: Sun, 8 Dec 2024 14:57:18 -0600 Subject: [PATCH 11/17] Refactored event starts_at and ends_at to a single TSTZRANGE. --- app/api/admin_sales/events.py | 3 +- app/api/custom/groups.py | 2 +- app/api/events.py | 28 +++++++------------ app/api/helpers/export_helpers.py | 3 +- app/api/helpers/mail.py | 16 +++++------ app/api/helpers/order.py | 8 +++--- app/api/helpers/pentabarfxml.py | 6 ++-- app/api/helpers/scheduled_jobs.py | 16 +++++------ app/api/helpers/tasks.py | 6 ++-- .../schema/admin_statistics_schema/events.py | 6 ++-- app/api/schema/events.py | 3 +- app/api/speakers_calls.py | 8 +++--- app/api/tickets.py | 4 +-- app/api/users.py | 2 +- app/models/Event_Context/event.py | 9 +++--- app/models/access_code.py | 2 +- app/models/discount_code.py | 2 +- app/templates/email/ticket_purchased.html | 6 ++-- app/templates/pdf/ticket_attendee.html | 12 ++++---- app/templates/pdf/ticket_purchaser.html | 8 ++---- 20 files changed, 70 insertions(+), 80 deletions(-) diff --git a/app/api/admin_sales/events.py b/app/api/admin_sales/events.py index 7c5b7871e3..c9a0a67f62 100644 --- a/app/api/admin_sales/events.py +++ b/app/api/admin_sales/events.py @@ -23,8 +23,7 @@ class Meta: name = fields.String() created_at = fields.DateTime() deleted_at = fields.DateTime() - starts_at = fields.DateTime() - ends_at = fields.DateTime() + duration = fields.DateTime() payment_currency = fields.String() payment_country = fields.String() type = fields.Method('event_type') diff --git a/app/api/custom/groups.py b/app/api/custom/groups.py index 71017c007f..c7c740872d 100644 --- a/app/api/custom/groups.py +++ b/app/api/custom/groups.py @@ -34,7 +34,7 @@ def announce_event(group_id, event_id): if event.is_announced: raise ForbiddenError({'source': 'event_id'}, "Event has already been announced") current_time = datetime.now(pytz.utc) - if event.ends_at < current_time or event.state != "published": + if event.duration.higher < current_time or event.state != "published": raise ForbiddenError( {'source': 'event_id'}, "Only upcoming and published events can be announced" ) diff --git a/app/api/events.py b/app/api/events.py index 37d64df9ff..f5d19ca22d 100644 --- a/app/api/events.py +++ b/app/api/events.py @@ -11,6 +11,8 @@ from marshmallow_jsonapi import fields from marshmallow_jsonapi.flask import Schema from sqlalchemy import and_, or_ +from sqlalchemy.dialects.postgresql import TSTZRANGE + from app.api.bootstrap import api from app.api.chat.rocket_chat import ( @@ -221,24 +223,16 @@ def validate_event(user, data): def validate_date(event, data): if event: - if 'starts_at' not in data: - data['starts_at'] = event.starts_at - - if 'ends_at' not in data: - data['ends_at'] = event.ends_at + if 'duration' not in data: + data['duration'] = event.duration - if not data.get('starts_at') or not data.get('ends_at'): + if not data.get('duration'): raise UnprocessableEntityError( {'pointer': '/data/attributes/date'}, - "enter required fields starts-at/ends-at", - ) - - if data['starts_at'] >= data['ends_at']: - raise UnprocessableEntityError( - {'pointer': '/data/attributes/ends-at'}, "ends-at should be after starts-at" + "enter required fields duration", ) - if (data['ends_at'] - data['starts_at']).days > 20: + if (data['duration'].higher - data['duration']).lower.days > 20: raise UnprocessableEntityError( {'pointer': '/data/attributes/ends-at'}, "Event duration can not be more than 20 days", @@ -612,8 +606,7 @@ def before_update_object(self, event, data, view_kwargs): g.event_name = event.name is_date_updated = ( - data.get('starts_at') != event.starts_at - or data.get('ends_at') != event.ends_at + data.get('duration') != event.duration ) is_draft_published = ( event.state == Event.State.DRAFT @@ -799,8 +792,7 @@ def query(self, view_kwargs): query_ = ( self.session.query(Event) .filter( - Event.starts_at > current_time, - Event.ends_at > current_time, + Event.duration.lower > current_time, Event.state == Event.State.PUBLISHED, Event.privacy == Event.Privacy.PUBLIC, or_( @@ -838,7 +830,7 @@ def query(self, view_kwargs): ), ), ) - .order_by(Event.starts_at) + .order_by(Event.duration.lower) ) return query_ diff --git a/app/api/helpers/export_helpers.py b/app/api/helpers/export_helpers.py index 2d5cb899ec..3b8bd4d370 100644 --- a/app/api/helpers/export_helpers.py +++ b/app/api/helpers/export_helpers.py @@ -33,8 +33,7 @@ 'latitude', 'longitude', 'location_name', - 'starts_at', - 'ends_at', + 'duration', 'timezone', 'description', 'original_image_url', diff --git a/app/api/helpers/mail.py b/app/api/helpers/mail.py index ee9fa0f30a..023c91f205 100644 --- a/app/api/helpers/mail.py +++ b/app/api/helpers/mail.py @@ -383,11 +383,11 @@ def send_email_announce_event(event, group, emails): event_name = event.name group_name = group.name - event_date = event.starts_at + event_date = event.duration.lower event_description = event.description event_url = event.site_link event_location = event.normalized_location - event_time = event.starts_at + event_time = event.duration.lower group_url = group.view_page_link app_name = get_settings()['app_name'] @@ -557,16 +557,16 @@ def send_email_to_attendees(order): buyer_email = order.user.email event_date = convert_to_user_locale( buyer_email, - date=order.event.starts_at, + date=order.event.duration.lower, ) event_end_date = convert_to_user_locale( buyer_email, - date_time=order.event.ends_at, + date_time=order.event.duration.higher, tz=order.event.timezone, ) event_time = convert_to_user_locale( buyer_email, - time=order.event.starts_at, + time=order.event.duration.lower, tz=order.event.timezone, ) @@ -574,7 +574,7 @@ def send_email_to_attendees(order): order=order, starts_at=convert_to_user_locale( buyer_email, - date_time=order.event.starts_at, + date_time=order.event.duration.lower, tz=order.event.timezone, ), ends_at=event_end_date, @@ -640,11 +640,11 @@ def send_order_purchase_organizer_email(order, recipients): order_url=order.site_view_link, event_date=convert_to_user_locale( order.user.email, - date=order.event.starts_at, + date=order.event.duration.lower, ), event_time=convert_to_user_locale( order.user.email, - time=order.event.starts_at, + time=order.event.duration.lower, tz=order.event.timezone, ), timezone=order.event.timezone, diff --git a/app/api/helpers/order.py b/app/api/helpers/order.py index 0b2de0f102..836fce3f49 100644 --- a/app/api/helpers/order.py +++ b/app/api/helpers/order.py @@ -78,10 +78,10 @@ def create_pdf_tickets_for_holder(order): :param order: The order for which to create tickets for. """ starts_at = convert_to_user_locale( - order.user.email, date_time=order.event.starts_at, tz=order.event.timezone + order.user.email, date_time=order.event.duration.lower, tz=order.event.timezone ) ends_at = convert_to_user_locale( - order.user.email, date_time=order.event.ends_at, tz=order.event.timezone + order.user.email, date_time=order.event.duration.higher, tz=order.event.timezone ) admin_info = Setting.query.first() if order.status == 'completed' or order.status == 'placed': @@ -105,10 +105,10 @@ def create_pdf_tickets_for_holder(order): for holder in order.ticket_holders: starts_at = convert_to_user_locale( - holder.email, date_time=order.event.starts_at, tz=order.event.timezone + holder.email, date_time=order.event.duration.lower, tz=order.event.timezone ) ends_at = convert_to_user_locale( - holder.email, date_time=order.event.ends_at, tz=order.event.timezone + holder.email, date_time=order.event.duration.higher, tz=order.event.timezone ) # create attendee pdf for every ticket holder diff --git a/app/api/helpers/pentabarfxml.py b/app/api/helpers/pentabarfxml.py index 8f9d129f03..e49f724c8d 100644 --- a/app/api/helpers/pentabarfxml.py +++ b/app/api/helpers/pentabarfxml.py @@ -27,12 +27,12 @@ def __init__(self): def export(event_id): """Takes an event id and returns the event in pentabarf XML format""" event = EventModel.query.get(event_id) - diff = event.ends_at - event.starts_at + diff = event.duration.higher - event.duration.lower conference = Conference( title=event.name, - start=event.starts_at, - end=event.ends_at, + start=event.duration.lower, + end=event.duration.higher, days=diff.days if diff.days > 0 else 1, day_change="00:00", timeslot_duration="00:15", diff --git a/app/api/helpers/scheduled_jobs.py b/app/api/helpers/scheduled_jobs.py index a59829f6bc..7c3c27c003 100644 --- a/app/api/helpers/scheduled_jobs.py +++ b/app/api/helpers/scheduled_jobs.py @@ -41,7 +41,7 @@ def ticket_sales_end_mail(): events_with_expired_tickets = ( Event.query.filter_by(state='published', deleted_at=None) .filter( - Event.ends_at > current_time, + Event.duration.higher > current_time, Event.tickets.any( and_( Ticket.deleted_at == None, @@ -54,7 +54,7 @@ def ticket_sales_end_mail(): events_whose_ticket_expiring_tomorrow = ( Event.query.filter_by(state='published', deleted_at=None) .filter( - Event.ends_at > current_time, + Event.duration.higher > current_time, Event.tickets.any( and_( Ticket.deleted_at == None, @@ -67,7 +67,7 @@ def ticket_sales_end_mail(): events_whose_ticket_expiring_next_week = ( Event.query.filter_by(state='published', deleted_at=None) .filter( - Event.ends_at > current_time, + Event.duration.higher > current_time, Event.tickets.any( and_( Ticket.deleted_at == None, @@ -110,8 +110,8 @@ def send_after_event_mail(): events = ( Event.query.filter_by(state='published', deleted_at=None) .filter( - Event.ends_at < current_time, - current_time - Event.ends_at < datetime.timedelta(days=1), + Event.duration.higher < current_time, + current_time - Event.duration.higher < datetime.timedelta(days=1), ) .all() ) @@ -146,7 +146,7 @@ def change_session_state_on_event_completion(): sessions_to_be_changed = ( Session.query.join(Event) .filter(Session.state == 'pending') - .filter(Event.ends_at < datetime.datetime.now()) + .filter(Event.duration.higher < datetime.datetime.now()) ) for session in sessions_to_be_changed: session.state = 'rejected' @@ -250,8 +250,8 @@ def send_monthly_event_invoice(send_notification: bool = True): Event.query.filter(Event.owner != None) .filter( or_( - Event.starts_at.between(last_month, this_month), - Event.ends_at.between(last_month, this_month), + Event.duration.lower.between(last_month, this_month), + Event.duration.higher.between(last_month, this_month), Event.id.in_(last_order_event_ids), ) ) diff --git a/app/api/helpers/tasks.py b/app/api/helpers/tasks.py index 0624f84f4f..3a7ae4e2d7 100644 --- a/app/api/helpers/tasks.py +++ b/app/api/helpers/tasks.py @@ -697,12 +697,12 @@ def export_admin_sales_csv_task(self, status='all'): sales = Event.query.all() elif status == 'live': sales = Event.query.filter( - Event.starts_at <= current_time, - Event.ends_at >= current_time, + Event.duration.lower <= current_time, + Event.duration.higher >= current_time, ).all() elif status == 'past': sales = Event.query.filter( - Event.ends_at <= current_time, + Event.duration.higher <= current_time, ).all() try: diff --git a/app/api/schema/admin_statistics_schema/events.py b/app/api/schema/admin_statistics_schema/events.py index fc5bdbca44..b1cd167e9b 100644 --- a/app/api/schema/admin_statistics_schema/events.py +++ b/app/api/schema/admin_statistics_schema/events.py @@ -29,12 +29,12 @@ class Meta: past = fields.Method("events_past_count") def events_draft_count(self, obj): - events = Event.query.filter(Event.ends_at > datetime.now(pytz.utc)) + events = Event.query.filter(Event.duration.higher > datetime.now(pytz.utc)) return get_count(events.filter_by(state='draft', deleted_at=None)) def events_published_count(self, obj): - events = Event.query.filter(Event.ends_at > datetime.now(pytz.utc)) + events = Event.query.filter(Event.duration.higher > datetime.now(pytz.utc)) return get_count(events.filter_by(state='published', deleted_at=None)) def events_past_count(self, obj): - return get_count(Event.query.filter(Event.ends_at < datetime.now(pytz.utc))) + return get_count(Event.query.filter(Event.duration.higher < datetime.now(pytz.utc))) diff --git a/app/api/schema/events.py b/app/api/schema/events.py index 387b2fc7fa..03a731002d 100644 --- a/app/api/schema/events.py +++ b/app/api/schema/events.py @@ -48,8 +48,7 @@ def validate_timezone(self, data, original_data): identifier = fields.Str(dump_only=True) name = fields.Str(required=True) external_event_url = fields.Url(allow_none=True) - starts_at = fields.DateTime(required=True, timezone=True) - ends_at = fields.DateTime(required=True, timezone=True) + duration = fields.DateTime(required=True, timezone=True) timezone = fields.Str(required=True) online = fields.Boolean(default=False) latitude = fields.Float(validate=lambda n: -90 <= n <= 90, allow_none=True) diff --git a/app/api/speakers_calls.py b/app/api/speakers_calls.py index a0a1b2d134..dfac3242df 100644 --- a/app/api/speakers_calls.py +++ b/app/api/speakers_calls.py @@ -44,8 +44,8 @@ def before_create_object(self, data, view_kwargs): ) event = speakers_call.event if ( - speakers_call.starts_at > event.starts_at - or speakers_call.ends_at > event.starts_at + speakers_call.starts_at > event.duration.lower + or speakers_call.ends_at > event.duration.higher ): raise ForbiddenError( {'source': ''}, @@ -90,8 +90,8 @@ def before_patch(self, args, kwargs, data): ).one() event = speakers_call.event if ( - speakers_call.starts_at > event.starts_at - or speakers_call.ends_at > event.starts_at + speakers_call.starts_at > event.duration.lower + or speakers_call.ends_at > event.duration.higher ): raise ForbiddenError( {'source': ''}, diff --git a/app/api/tickets.py b/app/api/tickets.py index 7c1b5dd536..249a3b2076 100644 --- a/app/api/tickets.py +++ b/app/api/tickets.py @@ -103,7 +103,7 @@ def before_create_object(self, data, view_kwargs): "Event having paid ticket must have a payment method", ) - if data.get('sales_ends_at') > event.ends_at: + if data.get('sales_ends_at') > event.duration.higher: raise UnprocessableEntityError( {'sales_ends_at': '/data/attributes/sales-ends-at'}, f"End of ticket sales date of '{data.get('name')}' cannot be after end of event date", @@ -273,7 +273,7 @@ def before_update_object(self, ticket, data, view_kwargs): "Can't delete a ticket that has sales", ) - if data.get('sales_ends_at') and data['sales_ends_at'] > ticket.event.ends_at: + if data.get('sales_ends_at') and data['sales_ends_at'] > ticket.event.duration.higher: raise UnprocessableEntityError( {'sales_ends_at': '/data/attributes/sales-ends-at'}, f"End of ticket sales date of '{ticket.name}' cannot be after end of event date", diff --git a/app/api/users.py b/app/api/users.py index 3ee00c76db..acb9d314c2 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -305,7 +305,7 @@ def before_update_object(self, user, data, view_kwargs): TicketHolder.query.filter_by(user=user) .join(Order) .join(Order.event) - .filter(Event.ends_at > datetime.now()) + .filter(Event.duration.higher > datetime.now()) .filter( or_( Order.status == 'completed', diff --git a/app/models/Event_Context/event.py b/app/models/Event_Context/event.py index b6a4dd8264..e1b1968f2e 100644 --- a/app/models/Event_Context/event.py +++ b/app/models/Event_Context/event.py @@ -8,6 +8,8 @@ from flask_babel import _ from sqlalchemy import event from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.dialects.postgresql import TSTZRANGE + from sqlalchemy.sql import func from sqlalchemy.sql.expression import and_, or_ @@ -53,8 +55,7 @@ class Privacy: name = db.Column(db.String, nullable=False) external_event_url = db.Column(db.String) logo_url = db.Column(db.String) - starts_at = db.Column(db.DateTime(timezone=True), nullable=False) - ends_at = db.Column(db.DateTime(timezone=True), nullable=False) + duration = db.Column(TSTZRANGE, nullable=False) timezone = db.Column(db.String, nullable=False, default="UTC") online = db.Column(db.Boolean, nullable=False, default=False, server_default='False') latitude = db.Column(db.Float) @@ -456,11 +457,11 @@ def organizer_site_link(self): @property def starts_at_tz(self): - return self.starts_at.astimezone(pytz.timezone(self.timezone)) + return self.duration.lower.astimezone(pytz.timezone(self.timezone)) @property def ends_at_tz(self): - return self.ends_at.astimezone(pytz.timezone(self.timezone)) + return self.duration.higher.astimezone(pytz.timezone(self.timezone)) @property def normalized_location(self): diff --git a/app/models/access_code.py b/app/models/access_code.py index bc8ba445da..309b73e7c2 100644 --- a/app/models/access_code.py +++ b/app/models/access_code.py @@ -46,7 +46,7 @@ def get_service_name(): @property def valid_expire_time(self): - return self.valid_till or self.event.ends_at + return self.valid_till or self.event.duration.higher def get_confirmed_attendees_query(self): """ diff --git a/app/models/discount_code.py b/app/models/discount_code.py index f19d306730..2bc5a4c4dc 100644 --- a/app/models/discount_code.py +++ b/app/models/discount_code.py @@ -62,7 +62,7 @@ def confirmed_attendees_count(self) -> int: @property def valid_expire_time(self): - return self.valid_till or self.event.ends_at + return self.valid_till or self.event.duration.higher def get_supported_tickets(self, ticket_ids=None): query = Ticket.query.with_parent(self).filter_by(deleted_at=None) diff --git a/app/templates/email/ticket_purchased.html b/app/templates/email/ticket_purchased.html index bd8ea9cc55..bb2bae101a 100644 --- a/app/templates/email/ticket_purchased.html +++ b/app/templates/email/ticket_purchased.html @@ -16,10 +16,10 @@
{{ _('Location') }}: {{ order.event.event_location_status }}
{{ _('URL') }}: {{ order.event.site_link }}
-
{{ _('Add to calendar') }}: {{ _('Google Calendar') }} • +
{{ _('Add to calendar') }}: {{ _('Google Calendar') }}{{ _('iCal') }} • - {{ _('Yahoo') }} • - {{ _('Outlook') }} + {{ _('Yahoo') }} • + {{ _('Outlook') }}
{% if order.event.after_order_message | strip_tags != '' %}
{{ _('Below you find a message from the organizer') }}: diff --git a/app/templates/pdf/ticket_attendee.html b/app/templates/pdf/ticket_attendee.html index 201d8f5af3..10da43297b 100644 --- a/app/templates/pdf/ticket_attendee.html +++ b/app/templates/pdf/ticket_attendee.html @@ -164,12 +164,14 @@
- {% if order.event.starts_at %} - {{_('From: %(start_time)s',start_time=starts_at)}} - {% endif %} + {% if order.event.date_range %} + + {{ _('From: %(start_time)s', start_time=order.event.date_range.lower) }} +
- {% if order.event.ends_at %} - {{_('To: %(end_time)s',end_time=ends_at)}} + + {{ _('To: %(end_time)s', end_time=order.event.date_range.upper) }} + {% endif %}
diff --git a/app/templates/pdf/ticket_purchaser.html b/app/templates/pdf/ticket_purchaser.html index 81a2dc1bba..faba3d0760 100644 --- a/app/templates/pdf/ticket_purchaser.html +++ b/app/templates/pdf/ticket_purchaser.html @@ -160,12 +160,10 @@
- {% if order.event.starts_at %} - {{_('From: %(start_time)s',start_time=starts_at)}} - {% endif %} + {% if order.event.date_range %} + {{ _('From: %(start_time)s', start_time=order.event.date_range.lower) }}
- {% if order.event.ends_at %} - {{_('To: %(end_time)s',end_time=ends_at)}} + {{ _('To: %(end_time)s', end_time=order.event.date_range.upper) }} {% endif %}
From 114a28ea75b136b4360b471204d621afe31e8ff8 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:58:58 -0500 Subject: [PATCH 12/17] Update tickets.py --- app/api/order_statistics/tickets.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/api/order_statistics/tickets.py b/app/api/order_statistics/tickets.py index 8f36ec06da..5972d23f92 100644 --- a/app/api/order_statistics/tickets.py +++ b/app/api/order_statistics/tickets.py @@ -12,7 +12,9 @@ def calculated_sale_by_status(ticket_id, status): - """calculated_sale_by_status""" + """ + Calculates the total sales amount for a specific ticket and order status. + """ query_ = OrderTicket.query.join(Order).join(Order.discount_code, isouter=True) order_ticket_ids: OrderTicket = query_.filter( OrderTicket.ticket_id == ticket_id, Order.status == status From 7ee88575646935b92f8043a02d28e2cc035d8879 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:18:05 -0500 Subject: [PATCH 13/17] Update email_notification.py --- app/models/Communication_Context/email_notification.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/Communication_Context/email_notification.py b/app/models/Communication_Context/email_notification.py index 492ddd4048..b9713931bf 100644 --- a/app/models/Communication_Context/email_notification.py +++ b/app/models/Communication_Context/email_notification.py @@ -4,7 +4,10 @@ # Email notifaction preferences for a user assoicated with a specific event. # This model allows users to enable or disable specific types of notifcations. class EmailNotification(SoftDeletionModel): - """email notifications model class""" + """ + Email notifaction preferences for a user assoicated with a specific event. + This model allows users to enable or disable specific types of notifcations. + """ __tablename__ = 'email_notifications' id = db.Column(db.Integer, primary_key=True) From 0d27655f9bebef2f48137ad9dcc3eb2a27e879a4 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:19:15 -0500 Subject: [PATCH 14/17] Update mail.py --- app/models/Communication_Context/mail.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/Communication_Context/mail.py b/app/models/Communication_Context/mail.py index a317eebddd..de5ead9c10 100644 --- a/app/models/Communication_Context/mail.py +++ b/app/models/Communication_Context/mail.py @@ -3,7 +3,10 @@ from app.models import db -class Mail(db.Model): +class Mail(db.Model):\ + """ + Represents an email record in the database. + """ __tablename__ = 'mails' id = db.Column(db.Integer, primary_key=True) recipient = db.Column(db.String) From 1c5922559f0c5a8ce3a3d1f1042ecc7babd456ba Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 17:36:14 -0500 Subject: [PATCH 15/17] Delete .vs/ProjectSettings.json --- .vs/ProjectSettings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vs/ProjectSettings.json diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b4888565..0000000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file From df3ecc305aa917c6dc88a168c2e68a85c04c4a95 Mon Sep 17 00:00:00 2001 From: Tristan Nono <113402224+T2703@users.noreply.github.com> Date: Sun, 8 Dec 2024 17:37:35 -0500 Subject: [PATCH 16/17] Delete .vs/slnx.sqlite --- .vs/slnx.sqlite | Bin 233472 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vs/slnx.sqlite diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index d752674e25270afe43a62dffad1e885a579fb839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233472 zcmeFa2YejW@i@Ni_WG@xtY+DA!xr|**9(q0Y*{wKa<^>2m}75uPdZ!D$#*B)q6CiK z0|W>)p_e3-gpv?afP_E_Aqgpj^iD_!seB1(zjK9$9|)md3D~* zdvE5=?rq=NU#e-H#d2jtu64$lX$;FU$8>fw409Cx&%%HGGZX$0^e+He)8B{t^C+gf z_=*c8YSPNODN-> z&YsQv{b;P4HutRF-rIHFs(`yW9A+;L*W|*mW*@r!dysZ!$Lclxy;F=l=vzwoGKqK@?lj^6dX+d8*w>)W_`+Xq(BHqD*0QBiK2TD% zin+9&hh#yMu&sAp@3!7eJ-ypIck3m3M{A|p#Ga)F0;=e06oGjg*s>Ne0@%>AdTp$p5zDwZ^LstT<0p_khL zQqtg;K4P7^T2ZuWwNxk#qahk>wP&-*;G}$wA)6V96lMEFwWf_2EVQE#D?1yd{~2EP zmlYZ5=eF{}!w*2u)KeZF9~qsTFX-#4ukgE@^PpFGtXH_Fiaa{1ReEG)NXt*|I?*zF z#(-7J?Bv7NW70W$8IZlnt?%hNXTXOw?)*Jik!JZ|i`u^XPeu zLMHLjX>?$)$LJW+W!pkxP-g1rEe<@y@Y-MkN0zKO=lXVOC2^yHGJ_0N>uO~*rz zK=xv9QQKRL?H>%H$z?tkO==c#W$F%#Z_(jK$+zg-RE+OB=U9O((mjnu+Qcn;KV4P@ zv6D?IVkiA`szUnQkn*>25;^P~G}b!2j-m4u`ur0|f`4s=@2eu-?CD(7H~ARYFIQ`u z3stRhK!amZW96l%#m=?8>sAl+@90#ItRd3o9+uj$_FoC zq?d#51K@ld4mcceIN)%=;ef*dhXW1=91b`fa5&&_;QuZMX7d8GLh3_zVc}^aX_dnZ-N4*-+3Tjr>65&`((ZY#XCK{HLYAUQ0BI!&zo6r(~ zj%%6{NyU_KG?9vj6X{GOEXNf!tfi7sEs{;9Q(8P6FUBH?XgU#2q_U7nOD4jZcq$q$ z6tY<*CTEi|D3&P1V@fKM4nspqIH9D}upE=4;kcSfCkjP5rY6*Ix)3j@Ni~kj$DmJX zHJr)HiEug*E5@`~ESXYb;cTIp$riFoSj(zVQzRXSn&K(wYq}6iXNt+Fk`BvSEE-jn zWLVK+(0Ejp!`Y}Df#wnkIh{&EUy5NR70aa3iV{wxw;DvTCMK zOaniPiA*w)4o3=F3OcUFpm)F#B^pzU@uaG0*=!g(oycg(NLa~afe%Vj3ujWPR5+cA zYB3dt6^UwLH5-e@l%yKYrjs%>2i3{xWIP-zCNrr*u~3Yp(_yu!q?6fbHk?sqU_l|F zgbQjS8IGosYOJ6XQ$^scmW(D-39T4TBr|AQiqUW;9V^1<(#2#_*0L$!v8HCCi9|LX zjz^M7m>VS;&K9*u7#dTQY%(5+Mc8R@IiFQiYxAI`_&fWrZY0}clq4mcceIN)%= z;ef*dhXW1=91b`f_|I`*roe~2I9SCLO*w<-yI4KgiUf*rewJ@%X@~(2{q>PjO&lNQ z?7=Rsnh$dD(kB?{6VeOPYyY|7IW0RJa5&&_z~O+y0fz$)2OJJK9B??`aKPb!!vTi_ zhv7gIzk;0o^_?zH2gO3Mq42}o42eZM&!9d`5ffoZ$!ZZDs2P%PGfox!Y zfcL-Rf5CsJ|5E<}zwGb#$Neq7Kl#4p`KrNq24;b##ZDbLrmLpA8CTv3J$ezuQ_%wlM* zsA+0JR`yv+w~tVwygy%qr%^4$*~6$aP*UD+!ME-s{nrkm;aNy?_KM6BD54!2g6Gg{ z<%)&cQ6hZN4xr~JC$%?sh)5(Qm&ZUX%o4j`kjx38SH}za+T=V%OCCeK%=OIIL?((l ziMui7^mnR6Ku8wQj&cdY;mnmRREQSP93xmrN~c;g%`cc+Qp#f!mD1o)&0NnMnQ{zw z24yi*m!2XrIlZgZJP501(l~R@mOPOV+#gF%7oRLLSyTs-)4W-EEZI8ukRhw3s)C~a z@=95?j;8G-ky!}Bsme7uKP*p}1$6Ol(ugu%t(8aeRs2*W?yseh#V1;_jSb6+HdG#l zrNEMH=?P@mv^Ml!n0&1wk5-3e+bXsAcuR#iXL$_0Lcmht++9SpOch$_O*_fzN$7^| z%p4GzCK$0YB-ae&+#R$oZCI;JLAP8G`KS`~UdW}c>wZA1kMvI?sT>aL|9 z3%3%fqU4e`tWM4}dkfJ^dAv4cuDg9RX;`k+G>GA}PTrzTB9jIwkkygWsKHD-pB8RJ z?R#jh#_F7x$4UkR+WLtckgBTku+~_p=4>G1EGxAVY$+vcC*~eUSSRB*RZJmaeW+%y zn1>CiRLkdKbdtWq%{o?OnxSh4O4`Ayfo)%p#_SPw=|BTAh%M`oP5@CG0Z9YNF(}Qw zXz7OClI|V`p=m7~kX$I&!t&S{ zylX|XWSf5!S=EY~TpO=w`3ic9wOZ>QQ4@NX=46Q&6vhXEjJ63gwIxI5;&as}Sf~k&890f|@t-EJ=}Lz!rEgIlrwJ-jlF>M}9}|#x3XtHqeZb zac+`G+h{pl(W+x08F(B9y(59R;Su|`Zy)G2YB0zP<3txR<6*rkz-b3q(mf%YI@1xO z95q;G>FeAm=|a!uO*^*rtr^(Sw`sk(iyaYC98|eXny?gaT|stQr94_J4I&b!bE>%; zc*uCg3Ar-b4SU!=oiH;Ddct_b@fw^;4CHcx1Rbau$XUxk)*&ZWb4AbEd?cwDRAYRs zTPY6egymf#(+4e9(Mx9F6-w1%cm+=tZ{x5L=l532qae$A?xv+6;;3>WusXVV38@|4 zth9C`nk}6$=Lp~g)IK%=0=HLFYTdAp4C~a{i$Pz3io(*1@I1JVpRy@_52d+ccM@pd5cq`E<&7Gw8Bl0LJ zWE$-}G+M9N-`CT-X?w4pzhy3|Y2SE3tBh*EeS^}0C|*&ml*g={Zk|KhP%E0MqAAyl z%xH(r2)YHz+o-0ERI?T#t6B!B>-v+y8%_5Qq`zjnDjjCpns^B$Bo7VUC zZ$_G;)0$_HstQOA%~IJiov;{b5Lx>4BD1FvnSmwDGQHC!SY&~ZfY-Aw4vEZ47-aWY zMGFI~MoKjRMCU-;^=vIc!tL%MI3QW(rX@frgRtifj+QHigf{t!9&`f*)?2-*MLxoO zgbo*m;gS9@DF;i{0fQqmykyEzF1=)vhlpBtaai7`8B2Scn=r3i8$Hmi9fEh!G_<5$ zgw+@gPgBvEoQzDbuiZt7L{hB1pDU2r?}p>VShYM}fvwM^mtd`?E-pcuyyzgLiHk%? zqZhV9y8MFWkanHF8qy=q+Xm^vb9X~J@0>iO9cPb0+EPCa(&jqLNmno)X$Eow#H4;H zExjVmkWQ0|((}?i(mMFwF8#^Bo_~p7$GyTm&E5po{Cxj(-y6Q~`Jb0&N}~VMzUR1y zd`|`gq5lc}!gr7F8t#3*a|2tr%Y0*@7emka2Dt;FPX*@%-U!|AI|*!m$#<;x58iKi zKNq?_FgNg1??e1Ep?8J`1OCwQq0RnRL#snE?{(f2y*=I|y|X-j_59THoaZsmUEYiN zkMe15&^zq8+H;=&Vb73fB9Qg$;y>V7sj?dPGmF|2qB#F6{qi;ERFB zLJLF9{Dtm6@ogb5f6)Cy_ZNb1`Y#LI>Av3msQZBX5^gT91%Kf#xwizr75r@QvA~7F zyMosR#<*{|S8!f;k9)qmiT!KvQt@x%uY)D=8S%Tk*MFAyXmGc9tGGw(6|WE{#6)n5 zxJdN6e&zbU>ji%$xX$%}>qgh7*;iecy2^gpm3O&>-wH2)f8sjfEZ0`<&+PZvXI&{* zJ9}U79sDj~uaFgX3Y~(V|D}Idpb+ea*?`Y9ej#T%k1@}*0SCsx6H(0*Yt%U9GoPK! zub?FGLMZ#-6bEZ0^K_8!AZYaMGZH_a1B-v3hD}H2(|*2{BVG&UsagCo4jVZQhXnIv zh@Zz9-T>wa)FG2a#(b)kPja{`#6BWLQB$8pB@L6A`2_lE*hkFAQE&BrVowA*iZhQ- z=NEGd9BSbNgsl?hV>9_K&U#>H9z(gz2W{q~c1C>!6@&c>2AW3(1giW|d!|P$ym=Ur z>Hdm4^AIBI{srd4*71DEI-UpZbw7aXM#liu^!=#E<;tKu3RY?bVeUf(M&t@~kRU#Y zvY72*<^w2;nc43T@a-J95^$CGT03yh41Nixn~$1`nz-BEr@Q9yt2y-UzA|tewv3TH zI%&f;OI!uaok#-AbX3b7Eqt6JE1CkL0IzDn9k_iCzmgJw!|-~yVOlFHbsOS8sfrS- z%&koje`LX-oVPUdQ7oWV+nRZwF6v-|4Z}H=3Op+EUNjD*1^J?U0Mq{qIVPO8ZM2Eay*tBQP(g|mr2yl4SE+QYuoh=5~;bNh}T)9>ODx~#=$C(Rov3G zh-)T;2}vj79VT9b<`js;QN&!0dP=kvEM3C&cbjm!C|qUJ>MM~}*W^QJ3|AnT(F?x| zH4al>g7=>x1GZc#or(`xDCgy9NccF4&X*t);O&qP;eK6)8lWVU^-?5R_)t$J=MprD z)iDh=#fr(F$z0sdXB&8npN6>zEdjJlH4jQpcyJ-98&`!JzW_;PwXBrn;rwuE6x;jE z`8Zd@{m7h$W>7yJ>)tKqT#~IJ8t34Vz)Oq3rG!RuHtqy^iILf}%hXNl;#om{9&5O8 z&z#9GgKrkM?K=Z}2gafPp3%Z5*{R&Kr=wiDOZK!`e3-SnVNXRZ8H?@29DWsR_86J{ zpodU-GZ8g?5Zwk$a;qL_=Hu)XuGDeVAANbN&44gMtIM<+;^$Kos=VTdphD^z-H$qI ztnFi{FLoDbc^bc%HM>1WF~a2P96=RQ_vSEatKrhzH=SPsUrlbzy{La!(+t;T3C#pW z>8{8jG**JMxF`orc(YrwIGc~s{N|-sLyRQVnATqv%`C-QL|JLnVsi#MY)5| zks79QC!T`1it9)G&bRSdc51ib$*6n!T5mXV_DK9f*5n>M2~{w)OK`V|WODY}^0 zR$~qjch)g(ekO|?hDb&xxvh>yvwK)q)hfhwYO_-J)H~3GPwkRgiKKqA8|o;;E{p3a zi^glXn=(ihr*JW)(Q^Daqa(vB&{zz&PdA!m?CS}mzp#U6IhsP^)merz8?Kxq7w~=X?H~DXy3j;Yr_EAS z*znXWK|Qm&XO2LEqx)nQW4gr=vj_>0$@{Vp$)VZhvH%UO;b)nT8Z?|Mov16+qcRU= zY`9V8qOT3#Ne3!tI85dsJqH=8wxe8Y4cAB;k`^jkCVxmPmM@E&M0bL;pl!wO`DjLi zFuOZuqt*={M-yIfuw!Eu%4zmy%tSd27sd?fc%~g~{$$t5)13_#E#~`Rcx5{I9ui}f*tz(M?boGL7AR|Omoob!ld&8LbjuWNTL`kMpSrCKdVKNBb_e;r5k0Z8!@bo zW%loYT!xTz(Fe6HaHmN>Wm={Z70A4F0l%I@QkFNL((}l(fL1PO$c4=K#pncDg%J${ zhTS&7-tZ(~T}_a5qUH+Y)rms+5O!&P@mUVgy!0JNnKaz~zYI73KbF2HeM|ZpcmO^x zJuN*UJuW>eeMtJCbhmVybhC7w^ls^L=_2V|=}hTVXyH zbhMO}64DCkNNKUu2_A$dNs_!0ANni!2!0#-W$34&?}r`h0t@MXF^Yg9uHL^?qDz^hjv5s!RAn3s3){4lnzBh%R-Ao^FpnmnW13F z9b$uj4*oItTJRUa9|yk+(FtD(ej)gD@KeFZf)54n3*H^P6`~cc3BD_MQShAL8Nq|W z{lR@fEtn6U01*rugX@Ek z@X5eO0uKi64cr#EF>rO@vcUO)GXsYL`vZFeO5mixKwwi~ec%{~euxE@1s1uFaL;qM zxTm{)@cRaT5x*;bLwsI*R(w+YnD~(RLGe!Uz2bYoZ*Y-#ws@LY6Gz0Nm=}*1w~EJ! zJ>omWq}VMk5j(|Jafav@1=n9)ue)Azz3lp->m}CRNhk=rg&o31VV#f@GJ%f3?0^*T1X%x@{@?q5 z<^QSwd;V|wzwG~<|0)0D{)hed`S0?-&wri&O8>?FbNr|K$Ni)JLH{ZK6a3r!8~khi ztNe5Q&HibAub=b%+4l$EtG=K4zVCa{_Z8pgeV_Jy-1ms@e&5}`TYT61uJT>tJJ)vx zM0=EdLq6GeqHnve-`DFq+L!i4d|kc;zINX%U(hFd|L%Rm`&;iT-XD9vf~LbKmK{*?o=sGWU7zGu-3u5x3^v;~sEt zboaW${-i(bU+jIqdzCvW{z3eS_$yb&6>%+fb-G$y(_9`GBfKH}MtE8H0Ys#HS$I}> zLinigpm2|H3wVF75H1wX5)KJtLPS^!9-kIrn&1%_{tf;&{LB0g_!s#v^Uv~6fUoO8 z{vQ4ohH>*8$3Dt_fx^#I_&ExnrSKUFKTF}$6n=)nPgD35g-=rW1cjfX@RJmNg2Inu z_z3$rh7YqJ!|=oGV)4MH@DTzYCEyVP9wy)+0zQmDFZ&@}{&e<13Ll{Gehf$1 z`zZV%g&)9hkbOUe_fmKdg?CeU7ln6Hcn5{IQ+OMNw^Dcuh3}*Ay%gR|;Y}3YNZ}0> zUQgk56ut)yYb|>%0oM?4H39D?;3@*HB;X1H-bKLW1YAbIr373;z{LbyM8JgvTtLA2 z1e`~}xdfa;z}W=U2{?;@GYNPn0cQ|!IsvB41RNsZAOQym7$=}cK$UnU7EVK0SiDeR$e4TY;Igi}8B<198u;n5VXqVOFQuB7lN3bPbuC`?nB zqA*Eeg2Fh3F$$v;MkriCVK;?g3YSy3jKU)+?4ocfg-a+rg2KfVE~0QDg$pR0Phls8 z^C+B4VF!hCC~T*&jlxz6TPSR%a5jZa6wab>CWSL7oKE313MC3d6b2~_Q0S-7N1>NO z4~1?DMG9RMLi8fboyzhAa0IZJ_)V5UU-vVAC*W@c{FQ*e5b$RL-X!2p1iV4O{}Avx z0e>Xm4+Q+4fZq}DTLOMVz-t8jnt)dc_!R-aB;XYSenG&?1pJ(UpAqm=0)9fkj|un@ z0Y4<*2LybdfbS9TT>`#Cz_$r_iGXhr@FD@z`siPvPe%d=`;+GS3k3SpuFW;4=h#nt-PWc#?o82>28MpCsTD z1bm!;#|iit0eH9F$$S)j8(=;{z@rFkWF8^lVFDf^;KKxbh=2zX=w}`v;C=$`BjAGs ze1L%W6L2p9_YiP50y*X`0`4T>4gzi`;5GtoCEykU-bcWD3AmYnn+Uj(fEx(7o`CBJ zcn<;B5^xOxR}=7V0DR;9Ue_Ahak>YmC*gEA zPEW+?2{=6-r@L^v6Q=_>-GS5XINgTRtvKC+)6F>Dgwu^U?Z@c`oF0c#sSl^e;&eSu z*Wt7mr)zQAgVQxQU5(RYaGFDD=4hO*!s$D3x)P;{qi~uP9J zIE~^of>LgUz%y(&O2Q~vj*?|4IT9sZC|QbsfgPas$JfZKQ*8m&|miz6YH>GCq08E6wCp{(|1r~fz zdc*f)?&I8S_I~y}-*djlz{b1OH|9T65<;*0_xtwvHV0k`{VeoNU&1%f7YGEruZNxv zJ?8yo=>1?remBuO_2xon`@a!*z`KOIJ5&s9@;@0mI+XC=3Ko5n z*XQ{xSZ-H&PW8y1^5+&T6q!C!D2-HYA9;J5toKuP?j_`3L@_zaf~J_Gmm z=La7R-WI$%a9r@L;Ql~_y$+rzI0*K4Pf!()6kCGFxLy@q>{tAYTrUNqu1~ur;0FIe z*Lz(3!NsnlTphySgx7>0`ey~(gvW&2h3AEvDr zgA&)pAI~r3*YFeAD$-6V;h(A8<`JbgmL$X+O7%)QnQ^)vU(5|*&m z3+{gAZhJ3bkD4#6X6Y^SRF~X2=FZu|GHVWCTaLM-O^EC0ius~D$J{!Rtyl1*FANpln zf#;ZOF+WXLBIZl*9CHnxd*d2B$6SqjZoLT4G4D2G=~Z}+xeB+|2yw|VR|bVvmR^VF zm@BZH(F^e$^Df+#!(55yn9K1%r@R!;F_+<{8rR}E=29$=ri<|$a|xdA$yeiW66p}K ztbPHWFIjFB;egU2tT3pJ>v1@;&^C+<@*HykmT21*d5$@sGZ0na0`Zalu zIhSTNF3NMvIb?LkRe6p%n{>&3S)OC+n8PHDD94;7!Q#@mFwdRY1o~#bGS9s;1gn;D zX`VZyO-QnEJ2AymO{e3W`o($fwAr9nldjHlr{Y$P%k$jCT+jx~4Y~RHJa-7!V!uGo z9c%`!PrgFW9cYEcVX8~?+&J!?zO?3QvtZS>U8Lu#(?A1ESLwM*5EeWAGCj8+cip&7 z&yC@}*)P;{TnXrsnuhw&Wai6gs8<*?3 z5}q}R)UVfbLzoW)Yq?<04Vo#&eJWb6<(R*|AHjvXWvq@#9y&$JzS)h2US}3Nv z%vbHX0vVV2vOOoy6LPfSsjk~|r(nM0cF@k5%g+IYJj|7Q?quBANtf=qJ=0<5Heb8v zPQukpees^#Z6?~T-g7774x8@Kt(Wh)6U>Ee*YCOG@r0QQ<1y_Dz~V=*;Bz~DLKA#J z&(jQ$+}3OO+zu>H=8O2;b}Ss$tN7eDJVR4m#^<(T`J>nIxh=Rt^M!nFb35#EQ(wvF zHsN}wx|Gjt#C$eg%jf#>lv^(5a~trmY*+KS<8WEiMV-{=7n)geJue-L`)JyYs?vHa z8O9a8v<@q|en~I&Vy4okRMz6kO&9f24`zY>M9Lbfg8F5>w3={;K7DeGSC|RxfM-r} zSi&Y<*=LT%QgPTz`^+jlL)L5i%sa5COnq^mS&6l1^3{FfD9lpJ<$WTHd0|}N`!iV4 zr?|lPr}2_|xGQ{r3eS!065pT1y|-TD`x96Wrn<=Y$H{0dSNZ-JuG)5)?~mfF*6VzK z1W!lfLZ4d^66P_cD}A5P%+Nc1{3p58_Y19zeyfiQG_Lg*3VlHO$M^aHp&jy&r!kh| z@{ODQnL-z1zuFH99ZchHpX9J!?oR`Q&T_jyU04hV(-Rd7Bw;>dzTd~~HZJ&apY$7k zoY!>4kH4Gl_;K0BCBIi_V#qB&&S<*kZx*7Mf*x@)-}AQ%Sv%gi=x-9jK(jsL(2NIU zx$4KAXx#PVIf2y-o?@6aU67_R%a;fnI6Yu;4C3X7iJEfI&GM2KrLx~>OvxgCh%DP>JMg_(&Dkp&r^=@^?>%c7wAR$NgcolIpinif$q zv?4w)-N>}!L!d1N4~2Lynkg*g%rOC68`pj+%bo6zJj#B03*_*iQ!c=^$!i#3dV#{@)h|KMi@Vp?2F!A~`0=s>H;7UiVt8R-j>|;Bdg< zfWrZY0}clq4mcceIN)&L-^+mrColsYZ|7$jqutR+cPtT)!%zGTEPOk^Vi@gCcBdlo zShhQgF8(>`21dF;`r^NLfKF=;2OJJK9B??`aKPb!!vTi_4hI|#I2>>|;Bdg<0KCjk z80cXCH}*dl7X}u3|CjbZy8mb4hyR@4{&Qr`;ef*dhXW1=91b`fa5&&_z~O+y0fz$) z2OJLk*Kk0BpR;4VUU32b4T5VIei7aOv(ld#_~(2a4mcceIN)%=;ef*dhXW1=91b`f za5&&_z~O+yf&V@Z2t4aufZs(o?Z0nu&WIciI2>>|;BdgIUH~};Bdgn5}OujjGzA?Gqz~^6*-%SQ;(WO6Ac!`Ezt|U1?bBQ}caO zWs-Wf^{(F0+u65iZSV1&yWdtFdxE}B_-x)ZIscx{rMs=o?&+#G1>Ma((9QKzcXN|G zqD|eo&|7q_QSvRigfi~w?AhGkkH)%bbIoYVfNy1O)d;;_MzLq2We+^ ztX|XKJH^O@zNLgOlbG12?g9Sp=w08tt#iw^zKyH5ozS_V_k_;X13NbNZGvhy_HNn% zy@LM({r$^nEn6z(10_|fm`m${)6cpo*?W z5tz4uEo%`YfDJvX*Y;XSYkT{98zj9mgn^rOuHM#j?CNbxW65Nf(P0~3^&;!WhleM& zj?2TPVo6h{s=zuQdbtfCB@KS*Bi5;_6-BF7ONG)f8lu5gdp4U4PRiF9vYCNMQMON1 zYubpxLOTkvva?b8pW$VHS&@-`ZYv)=`~dV!J>}u?k&)BGI69$I^?8!ySTqi|`_=;UugQz9*5*O!@^0ykp3x9q9WhD&r&jVE z6JxMS>MNDrgsyozN+VjeCXbBm=|qdij=qhslEQk0Br)uDH?Qbo&z7(x>dm71@+i>} zq+>ohtpl6-whkCOkDkXUWD+l(Mh6CajE*5)wk;$Eb*EOTf}%}Y`OjuN?&hv8_MDYi z4)w}N_114*s|;F+CJEFD=1F=Rl1C)N=r9>hW0{S-2al-u3h8`h`H zF39;Uazz`h<wY|mI{=p!cT;^lZq-GIUrtYx#79DPse2dOa#rUps zjuprv-P2g4P295g(`8i|EQsZuLO_j!tE~f;G0LFVmppW!~K! zZD;HAu$pYwYPHhnAl7Mm-X<8qDo>O1VKKtTeNy0XO53%C6PuSUV^6@6Q{4||G%a7% z_K$0$aB8!D1Z=BR>LuuhC0^+?I z9cEB3(TDW3@g3pTZSS7kb9z2Pbo7Bd|NA~qY6g$t^wT?+oV279z?N=ftS}h!&}&1D zvSg69`9!(5H1hOq+5}eUabR~&Vh75(ZabLujoecXxO0`cKWNd>c@IlY(5FxF_U z+xlHKq$BA2N1c5;ot%0yaNj1&5lHE=U?xv3F`a$e@jxX6Y=yWs3vg_*^$uRzrC*>bmQjKlktpk?$dy5@Hq|b47*9=4d9wu4k+q9wvi-Dr$ zjlYmQ=#IyRY#8KOhf@|K$JA9#sV+ttm@VUP(g83SV$?I~|iIvk+@O0YY)ZO68lsa!vCoAsTuwr%piLN$N>DSbH zua|ghMf+d7EbaXK|8^y64CkM50UGS40@~=?f7TGO^b4H|_jDS|%V8Fe|BI`Q;d!$9 zrKrzoQONCFe)OR`9n;cczqB~4rRH3IIF}#)l&9lgJc8->8vp;h{BWNC|93h$oVFYe zI2>>|;Bdg1(PliN;P4hI|#I2>>|;BdgXDX9Eur6qz8!ipba&{i&`4+?v@*0HBnE#I{ATd+;EloY;PzlPxHuRH z{4Vff;7R!1fXf4wz^*_xFh9WiU-7@-ztexI|A1fi_xt1i7T=$I-|~ITca86WZ>KNp z^Lk(Ne#Lvg_X6*b_h|1NugCKn&(}Sl@Z9RT*t6fW%X5@xk;mhH+5LI<{qBq0ihG^A z+wB!!5uX$96R#8NqAVUIPILXj^_1%_*SW4et{zvb@Mqyg;UVElVN^IyI6@HlpYxyN z@8_@OC-{^2mHd3(%l(>ro_mzLiW}oLb4PFi_LuBe+56b5*&2Hyy9QV=)u*%0ip&bu zE8k+H)dg~F{z_*+!GV`Ehr958Ks^$`N z-zhT7FlAVSw`3oH_fcBt&1Z;A2c=sG3r`oBBoM~rQEfOsrd38t@YeD2s3lYLX{7X+ zJZPG&~Dw&R&sO0!6e#L+~E@TDfAOc9aNTv;!KvKY3DnbBBmTQgV3=#KJ7G3kJ!Y z5PEgIkgrY7Q?%qU#LHaId`)DcsFS!GQ%--UN(6*t0qrQ4;4Q7@N){?a3uulJEF`5< zt(oQ*%q=P9v587)aHwXkXO2uchC73@n5j!o5t*Fc)oLDuRWoUvIcH0rNC@tarKgKe z7MU!n1IcOLtUQ)%oqNcT)lyX{kHh>ZWz{;Gwv$9=Aqb}muTIPl%M)e+UA&t#qKsE- z<&k_9zl;s{*V4%16D`@shGj(?Di6a_V9B=h1Tt(|Td`aj$=53KXmwb&tx}7Rw^WF8 zmdDUf2v{ndyNigHsX`0AX(w4d3Ej}0nFAuz1S3|4>%;Z`D5lw8t=)ybJ=Zy|aqkJpCGb+>OO4a>C} zysl5PPTrzTB9jIwkkygWsKHD-pB8RJ?R#jh#_F7x$4UkR+WLtckgBTku+~_p=4>G1 zEGxAVY$@>4TyqcS9!FRw<6o+nLc;n`&0aAN8&av3&qG;B-{EE*D>BW{HS}WMs)21^ zkH+i~b?HC@GKekfkWK(m8v#iJ$uTI+y=du%-IDGe2BB#!5rh#C{$ZRy@tN0u-qzMb zI#wD5p1^w?%^jP)hOF6xFx5l*hmERQSEFUp18X5n2i_nJ((GgC3|0qA=Bj4oL}n%w z0d5<4JC7!M37hP=7OpCl(ip6{6C=YJoij^U5p7Y+`}U28Rc&mzJb^NFgDRt6Z&8h$ z9q%C0rr8E9foO z)mrz6n$Wv6CriYjFg^%mv`v_)Eg3Q|2g{Xx#o_Y7s$Va+AWfF<3g{NR@i?qj-#*Z5)L@Vo#)&Rs#>0A7fYT1JqrQ^n~$< z<25*y7|7)W2|7?Skh7M7tV2$$=8B%R`AAYRsK)qMw^AI`3Cp`grVm=Iq92)opHQj} z!%y&3@iq<{aei;LJPNX`=WbdGB91C20;{8&myp`wmzCCTM6;z6<{SZ>fZE3HUa2iVB%VI}eT4EB5#G^lsYTtLJZ- zOKRFTUeGF|8gSpBbRddXR4e5%Yp0v%kT%qcrmASl^&&IcVKahmf$}!0X(QFF#R_fa zOlK=7DQbYIx>AO-D3O1?zC|sd?UQoA`ffB~HU!q)EAxxQ7?XDfF>9w@YCX7@n zuo~F--`qroLdCbiu358)K#5@wm+=@Klmz(>GCR=m6~4vEZ47-aWYMGFI~MoKjRMCU-;^%`4( zgxlRia6q!mO-q1M24T+|94%K232pKdJ?I7sthahqi+qIn2pujA!)w{Yq#P_&2MmtP z@RBJ))hIK2jNmM{5Dvfo7Lo?EeZV{Z2wP&ZVR0j+7`-&=7(Itp9Y@} zzCTzGYQYV`MS;Htz8!cxaAiOX935!$zu|w;|A7Buf62ef-|1(4Kl453d(d~4Z``-b zx60S)b9rC!e%bqw_j>Q?-jlpJ?|d)o`LX8-&z)fJtDg0q`^1X4S?m@)u3x&o?0U#`gX>h+DXw*{E|**Qnee>uuyDO_K-ey%gm!`D zf670}-@>24Yy3t&!O!4+%YBo3oV$TLmD|o`xmNad_S@{I*!QyMvUzqjyA%d(eCE}` zXhwGHIN14lu;Z0|a1Mf1X1~t5+4WOl@@Wn;p}h`PGqUo)l-{SIpRzDh7u3OWM%HX? zs8mt&W1w^sd3t&@>Ta%s)r<^&{XlC_=GMVnMy>*Ss@LsZBSUK)tYu`;!r31Qfw}FL zI#|ib13`8fGpVx5RvQcwK9c*P}N@L51cqzirICrrjab5 z9Oj};b+DsbfiPUQNI_E_>}Q1Ed(hI$&N|r4Xd0-yg8ClJRnD!0$&9+&*CP-2VzVC( zWhO4nuY4OdR|mTnO}bJ&fK?%n4sqsDwbjAiMMK7` zLv?(_Ol+=$m5Zzz1xzwHzgLWko9kfTBK9ii*YC__I_hBJBKfx(q(;fvb+C4kl-ZYy zwmO)(He0Q%uTw2`Fmo+zGe~W9FmY|=PSVRQtb=Kbe2d$$4{IG3lz!xCfIb_!=GMW` zMbfybyb+mclQMMH!PrF;+lwZ)2Yf1%vK(0lOScEI^k9d@Ixxg{=njTSndjEQ;zbSi zz9I`fMEsyoXlB=x_#<7jnJN4EU)xkJM>m$qikCp>}ND!lPVj;g>^8bk!+DA%2d6%TP<}krcv#Nr`4#Sr4H7!MW_u@XB{kO z#3h|S*s*Qtc68 za-8elS538c6|7_1_ziblR~?Mw)le4wByJfb4=k~fJaS-x^=k9L&#i;Oj8-ypUTDdv zY(X7tW^_~}8OXr{j+2P5My4a`U_GxiGJ!hqE8A*UVc8qL`77S5}K zL5(&%3*B79{5n|H=wN}56pcfgInSaxnA!SL2JX^fa4FFR&77^P4mLO96RxT#9{_WP z{0Q6R>#HSou)A^jqZ-p?W@1YnOm`&1 zkkNLR)KLff9dUxJ_TU(|N=-){Y^d0p zNZ0I*9Z^RnJrF=0O7K&w==f5ulupI|9CHne>R{9(wqpAPxwSxN;F3i?Wa&U_9a;E| zZ00K3>R{s|?ZiGto5szrgQbrIxH_hRys&#Q4?0j@ZW8|6oI;pb`wm;ftXufJ5 zHWTaBV_O~k0HiOtIm;mC*1-{gw7*(bO7d`ixHM|Lx@fC|GXR&K>Q=RmoB^mbbpTGf zz-y}`cR(YDrSaA}I0P^U;rANhHqFdI6#suQ_jgA6t@H!w^U_D8JEW_m^Q6-t3SgVG zhWop;LYgOWp*KT63_TlqAarf$jF1}I5Q>FbLrn1J!7l|L3EmVuC%8Ab72*LpgYLku z178n(JaBv9;=umE@qt|6h(OT)2miPIPxAo$9RA4{gU?)?@iuwynDS{y&3O3ujqNz^EJ=op4&VZdBz|%;AqccPXN3H zFS(y|-{XFl`+$3od#!t!dxrQY@dx5F;{D<^;_0Fy9w$b{7T4chKXX0jdf0WN>ugua zwZ)Zo&2_niUkNV=9}{jBE)>ebPGOa>NbvK&aEB$1|#4^cw8m`N2-6DlPPQbH<|){?PAB3qz@A|VviLLw8%7L(B|C1{jTD9D*) zLW@WA5-KHR<%E`$wStzSB@{x)7UOa}UQ8z9danwEkjX~1SRooq6f?AhObBT$6V0Sj z(M(h?aSA0&7v{4Z^6?Sp+cM!MLP$mANTLwevKft5buu9&v(Zc@3HSNM2qo;HghW)y z79)vlOdrQdln_fQaUdiVeLi**LPAT&vuP!&$a)(m5<*Z(O5)h z;&w_%#kGPGiAN*4P;aAzL^hF(MbxyS^J*(4#AC%&24=UYm)JrGk!&=oCY6+8G`^V< z(vhqjjTci1UEnrhLL4+BsVQq|5Z9swHB~fJEkg*gOeR_^#tX@qKDB8=hyV*CF%XidLaRz)LaYcq zifCF2bd(a3grF57nM@*6h-f-X5`=)%DVxqjBXPY~aY87>vuZ|(B-0svYGafTg&2&O znu;2$Xp|7-tQITAW3ap?XyXw=$VLl=M50iLM0LUnLdYm_HHErX)O*!U2x%pu7ShQ$ z$O^40ObH1E)FTlq8XL=ULP!-dGVCp|>g(fJMhS8zUMxmom(b_qNJ>bm(P$(ci^p~D zb`e4nmcwYWSX3kW$d?jALPg3H)glpH;FeHAGMasguCn&LK zER#*gbnbQ%LZlc?%jrZS7SUyQ9wihq@swIjClp<-=28MQ4huj!mC$vt0~4a41X?1Q z%EmJK)XpIUMMDd++hq69c{DaABwIQo19DIpzCXOqx|p_~Cqh{M_d`(q}mch^q| z(M(*EwMa(McTOK6z^a#w#|wq5QI(exQn1;;i6Uuel!p?Mu_CP2K-8;p69Sx*U@MnF zIdy_a3E33%7S^()u7fT@h{M*Ego6ewO>_Ye2q6Y5cr+b{wM?HVo)Ds-{jl_CsiLk? z93ez93AFye(x($xN{Gf&@pwWl7Il`uQ5ep<5v`zRqfnU|qw~T2of0w;C6Sd=T8#FJ z`x_;s5}Be>$Y@0>)ZAYwA(>4?ipfGTK^J81FNC0Gvw$tcQ)xPK?$4AEOKPbsoLv)o zRc{i44CgU55>sMvI_KP<2muK@9NmjaU9Pw{2m#JS#Y{XImG#pr_dm_TG8kYQSe{a3 zSdi2BpwGQd3P3fg0!xgV(#Q8lLP(@R*y3s-s;fEo2TF**F&pM1ouMlR_j^JB_9e1P zI-b&XllvVdz|kXCNNIA6t{B{J2_afYfi!4EIAD<}=YB&8a)O(abvl=~$mgh%17 zy$X>GI2MR|hWqiIqh1Z*QlfDZ}t5Q0VqaLE3@h?~I( zj|evj=Lma+twKha2l4Z-@?Ya0=WpXL;>Y-1{L%bkJ|O*E`jYgBbdz+Bv{%|HWxz8a zhF%SQE%Z1<3S1N#3+)OW9a#XXOgDO=DdR3J17%TNUn zS`Dr&a9Cr9(Q&Q93bNK`HCX3UQ8gkPo7u}`xEdIMi9$?^Wc5?W&j~?|MPWbA!eLt9 zdw)g2_-}$V3EXPT2?=4lBFUmN20Mf993e* zvFb;pL^c+YQ_%vPX!RZFhm;V7Q-4N@HO^aPalz9TRnl_QI0b$mmq>!48H*?6IP3*< z!`zPvj#uaZ5w8xI*D2VOqsd587l!Wsb+XX$i@ho0n#4Lf~lgPvA;@6$jJl{WGBFxrp9!_XDA_tJQWcoW_VUV zO$bpio#a#|8%ye@=2Mgao}r>DtKb!&%hHpS06t)FH^VxnxABBdNTaj2rlxdZ_!J>T z;5eR46ycnvxA93z0A~oWB@*5obkcJ~D_;geyX{@^+r-Y~)1;aH8W+m;_Hv zh-w+|I3{5GqisAy2q1j%v<7}*!(#g|A*8@lo(11?-0&TINGBwcP*oi43R=~JlmLbq zQi_b>7J7gZQs7jOlM&6ZhwmqZWUK&E4(70aO6Tt*1n?xMxLnMpVBE%H zbT=UY|G*MKI-^VMU6cS)DFYiDtL>eX00Rf(PfHf`iMj(5QbllO$c2~^S9HSd8DWIu zz@Je7R{**U$d8Y~(@|P}5IulXA+hoBxQ!{Ihltm02|*(T!M;T$Q}CEX5sp&jN**Gb zAR0l%L3CBKOx~In_E`!g8-+*|9bEg|vQns8%Ej}ts>0pjC|q++ zt|GCabG9sn!f2_Xy4aPW_Sr$t{WZlHt&tZPxZ7%{eu>nQ;|UNN}M z0v9`#pX(?Ad~_N(_O!U}H+>Hwq~qXbK@w-^+O>p`Qqt)RIA9VfUD2;0gk&a~NP#a9 z?p0_TS5ra^`2pYvYAmUbzK(YhLM)z2p?{j9kNk2%03Q$ZHJ(Tp^foRd1W3qBJA_m|$Qizy+YqzkbG+{EZAb&*bh3%>;1oEQVVkP<*K zW$^#XhBM~^LV()=*y570Y*gpf`IL|aSBC=ohOv#GM+xyXY}GQ%h%Q&>5&|q_uuMlx z-rRF^0xV&{r8mD`A}c&!PmlvWb9m9Trl`#4`yY z1>8%b+Y941@STK^MAMg&wT!WtoIwfT#{p5yL}U7q=X63y#9^UKMZlM(v*a{Fh$q2O zolL~Q1xy=1l@g+IBm(Z7sIiky5CUihINstaoGNLFLzJL`9~(-@SzUY%QbJ0FQ%W%* z8@DzGC?Sr#^x)_*T(IMW5KY252^(p=sBcm=N`PyCbSeVdtlmbI5a9l`2-it)^`;Xl zKK2lE13Sb>zmt9>JtsXb-78%uT?!WdkaUu?QCh_gN!`*6zAN;{(Dy^13q2INIdnm2 ze`t58H?#s`0Qlgm@J4_qgC7W96Fdu|0CohA4lV_2|1W``1-=~kSl|wLFTkNdAg|oxUO8Hn9JX@J;i+ z>HP`B1ANqboA*-h0q-f^yh}eAe@z=LXNYo>9;7o;C0U!E6uXe#QMY z_a`AL;41g&?xK5(`zZG!cSw9g{E_%Y@lo*>@nW$CzJO!Jm^eoiUB7X?%n z@cI1+Yq#$CF@iM$Hbj0V@)lyOEn0&gC0J{y20ucu);JA*7-MZg8vH(twMA&~dkNMW zp23$W))Je+4-u?2FoPc?SZh=UU&L5jNCvMFtTi5kR|(b{jKM1yYm3C-3m9t)!{B9% zwZ&lYrw}aMqhvI=$I9R<1wN0lw&)A~WQ?_iUhsPe)*5%gpG2_MpbLIC#@Zq-_!BYK z7H+|xV8PN@3;uW;7O(64E{wHBS@1gv)*52L4-l+1zJlL@v9{m}emlWhBP;lA1Zxee z;I|U2HKu~!g0Z%M3Vt)eTB9lWO$cibrQkPWtSyd$?{Bam-3!mWo z2-X@q!5@pUw!jH~J;vIiCiry(YYmy;dkNMWFTto+cB=8c(+M*Ho z5W!kQ5%?g%TH_G-0Kr;=5O_bqS|bp6AI93k4|p%ZT4N7*55Zak4|q4m+M*74kzlPM z2fPboZSe-YfU&k<1D?lNTciQcVXQ68fM*HT8e_mS2s36~Wqq1b#`d zwg`bAPl^4(l-Tb~iT%cu*cYb6ehF@L-EhKh=T{y!93aHcH%9|ljXG`}CO0Ah{Cv9+ z2++o7@!wO#0eJW(O!DIVGzwrEzt|cCFr8mwivhqGO9;R$K0G-BK;jo#0sw;iJoEj( z^cr(DA7g~C37-`15v~$W7mC6b;V6iS5AkpCKjOd0KMGIPU(DC|llf!$nDi~_)6#v? zd!)LwPa2SNQkOI{^w-eOLtlX?fICC)3QdHR(8f?2-WlKz{xSId;OBx51#b?j!4>e% zfM)_93fvetFHjDg5aR;(!?3dtufj{RhufuZ!pBEn%?-1WDo-OVdPl0y~ z94&^yC*X$&fnT^@bUovG)ODxpYS%fgic5y426C=$SBEPA?-+cAf9U_P_ukQQ6j|H& zbebHTZAq4MHnt^=A}k0eY=cd($w|zNW^CEABulcfO`aK%mz)-s%#x!?HY~|Y&T(N` zU|DibOI~*QJ@;019C_b;|M;Ero$q{x(^qrrc6D`kRdsjW=RQ}vSUW*mqaCEp*Jf#D znx=jZo`Hwd8`N{vgdZ^lt`e z<5j2PJCDNfC%)9GQmugU07*qiF#D_in#L1;D&3l@$<{MCi;kx8gr7>Ms?u1ms|Bc+wKU<={UGERov%Q+~`&O!K=93qfjS#6w2SciZ{KA z+q{Zfy^5Q>iu1gRWnRS|Ud0lxLh~qmzj_rfc@-~s6_0rpcY76gdKI^L6<5;}%rO`8 z`hgdqqU%R|073~$a^*~g#mxb1iPto`l%?nP^USwMjGDUkqXx*?B z?RlwnVN$f`SnC0#XwM3*8;znp!&(m%MSGgH9vq7H6l*;o6zxf&bt6!;Cs^x&pJj9W(_Y18XU83DbS}(Lj`=ijhaV6Tlto49Ow0kCKyZujy5^W3b>VcDJn_26@ zl4y6c)&nHb?qaP6MWWp)v~CEAc8Acq@gv&pto49Lv`wt_AV;*@q}Bx+(QXx5H)ce; zMQGiC5$$Hyde9=;O|11mMYJ1*){PU<bz?oW^I7WwdT8gd)`RlU&Sk9!;-Q@*v~GNdb~bB0;12C9p>-oWv@==jfputS z2(25_p`FfJ51>OkjkO*$hxS|6dY~NIsY2_fh%DSnC09XvYh!8?~YJ39TElp%w8lI?(YdrT;|ye`|d|`r!TF3g7>!iSERHi5(K7 z;=jb-h;NFY9dAdpe|0<&`yh5t?9A8-p!qAJzeZn=-o@;H&C#;R50O7d?t(}ED8%;9 ziHwc-!taM42wxOlA6^o!4i5v@|I49Gp>yEDUlyth4Gw-6d;$3V)4=qa=5V#eQ z{5^q1;Q9Ca-}2wqPer>a?Xt~yfr7dZd!1LxoIN}IBWQm+ihsq(*(d63i* z?TgJ6kI%k&CbP}RJjm%pF>wI@>trV6K~F~n9i{x`&RRz2K~YD?F&T6?pulM{ArFo^ zsz{>o9316tvy98k!BOrso16z@9Wlf>uzfDJF2@Og!On492I&coa%Y8=d9c|LJ&L13 zXZf%^2JfR+*AZQfb$F|&JYPy+H`_eQ@H`0Y zXax0uH;|x^R!LbN{B=ZQ(%uG^SSF3K%7*1ZUsp!7Y-t)HzRS((D)L~g8;=6Vtf%gXB?P9M5PR#`llZDYuhd z&%`|O)R{(JawpqvS{_7obduXjv1SmHD|CU8bpt5Vy<6UDd=qnC)yk(HM*2$+jDj2hCljJR}VcyJ&JABzHTYXd66E zwq;qKi0*`?Aab(HM&-eDH4S+XRXDQL+aRtoR$Zo-iJoxgcpPNa9?4q(f`0}XtS|pHm*_1rU z@@Q~7xpkchd~DM(c~IxkMRJY(ciwh&)*H=yXg{ zM7wBIo_O+5WWNWxTQMpRqC8<>z6rVw%JSgJqYGm3R@$|X%!40qBFapjT=%Xc^Weqf zVn-4nd+*_SP~lb3-XaZm-4+ zD;%2#7anyDVdUU~v~9-aL5gQry@sIAa~L{ag58Ew^Ptb8i|Tl5wO@nXwv+PU&~sGkcoB9R zj?RNnkNSn9Qn$tMd{}f!`7&%@hEaKN=~1V%--g}0PRN5qk0u}Q`>@+=WFAC%G%B2o ztM*|g=Ru{n1KwR_5*(|`wTL%O+p;nbPCXhWE+3{{J~|ItJvv#(+qJtX<#`P=F~Vd)2J4{J3LEj^?0)K3aT) ztQWgk1(nAgh0BgZtxF*-h{&3OYOV5$ba&*s(9w}6z|yyGXijKm zs2rI5x1vVm>&TlSf8^ZYlgdUV7d+Iz+`qdq-58|*#9!_=>*oSrkU@sNYJG(EtM-BR z3=s7fX?d+p+f!@MMrnq>F}T1#3XK0>8GnTz{xcg32KT}^)?=g-rRs*L$4?F}< zByLWemgrV5S5H(s;d9?nouEb%2P7JmZxR#3LlXny-^M?Q|1I=R8apz!TKS9epmL3J8gdr?%6Sa# zz)D6w+!k(%9U7Y(R1n<|iGCmWH2QkzEY5p)cJ!#|^5~w?nrK;g40sA}i1Z;Y;gn#v zSZ5I1!TNaB>CQJ2#<&t)+$iHPjWlA}vo+P#AVHCFD0)H^RM)}3Rhw->o)#mUI2y|HxlLb}v>4qAF+L&Z#dXx)NtJ>?D0MQ5EP>0+jA_@>{*NV^>fXiiM zpe|T!5GGXva2NuWO;!JaCK0Gt~01a(n>c+A=it`#^E<#}kbz>SQ+wNlLj z7dQe1g2l!QI6#45c<^El5S#a_sLBI7K*7I7fd_ejf`7>ZH~0VrzsLeN{s0C4lm%`G z0ty6+O)3qRnrg&+Cau`wpX45OwLq-me=BVKM^TUhZv)mf!M0=uaQz?);51Dk7_7nM z*3rHf1&C;^BR;HJlVV2uP8J|q5A;0^4Hl8*x1yjCL{%VWOd{Y-+z;&^qM)HESKXSa z$+cSa5Q4@A@qj5XK!DlL?9|%VVvl-6LZ{Q2Oih(pm7uXn)q|fXokU1f+6-6xQtVL& z9?R;cbVJID82myMfUm7KSB(>?H$(6~7X=7Ptg5QX0k&&KM13X-sxydbrXf{rM%sNU z3aY?`)sReP5z{SC@RNby@=%;9*%l82yN3FI2_J|PozpW@(vmD1s!t{U5{o|s)6qQT zAbE*^ugMX8r4@DjF>{kxnIL+*+SQ~w+dBg)Zzz8&(cP`QS)w~qxwS;sq1;rW^DBFJ zb>Kc(!rUv)C%U3}Rcm~|dR3jim%OTjeJ^-b`}!X9s`l~S?Nu%D-RV^=_TA!DEmS9Y zRr8hGysCN1d0y3QWtmsi?7NzoWbAh{+%f%9W4j7HsjA)=GEp|2FP`}pCUnzE`Djqf z)M5Hm=AJR>WQ6e)@6|WP8|1t(-URtd-T3WW@KWnO71Iab7&;MIZU=(`f#9r`yVy65%JOLVvEAC%~B z)1N8P-KsxTqPsi46eV33TOn+Uv;ZVuA>hZ1r1Fg`UE5o&oucQA0`Wc zTmT5m&;gZF-R07 zK_UR!z$P#O$~^{(0ubS%i`F+LP4WRG<1l5b%!BhEfyocbP34&ToL6WnC_u9@d z+DdN0rN(k+&&Ft);k7Zs#sIHQzsiVNxArO{TvC3m5h~IB(eRh(?lsgB-4-4160;O_ zPDxS~-&2)(1KoH^qPhk=3o^my%*?u+a;I`HcS1++#ofo08{)@>TfN5jNMbJDst>qJHcjv@L@8uZg zNk#r_-ZQEX#dLr|kc%xT*Q@cvOj_I0)tY1KGF;cU1)G>zgqm;_0)zF5m>3+&eSMn; zL8mx%&3lNM$TE|6WU*+7OuV{tNFRv0x)&%P$Mi}bE}ScH0KS+)Jb1?H&1hU#TT8lq zZMLhs4T+Iu9z3paj=Dfx&#pGQo^#cUn4Aw~Geoj>^)~eZF_U$*Rj6}9nAA{jTcTN9 zyN(Xz0RrYjB zT0*;oW`x4Q_k({5o*!I~IQ{K|qk~4^!@!e)+YzIGcpx3v4Y~d*{Qvg9?%(7;-QNlv z{s`ks;|b$3<7i`V@bekS^7lJL;m_6++DF<}?M!VIxcMv8Pt?uo8S0_x3{?j=-xlQ@ zC8zAJR4IdTD*gTE{22H7DhhDu(gM5VB~W?8T81gWt4kgVJ6oDvSW$pa*SqW8=B`5v zaOMuj+SJOnj+H6J(oZkIk2@DtI$e8qq8QmX%v#13;MKLfbKTkHZ9U}finT+D9emFYJFxp?;JQX0 zA$J4D7vPGfwQ{%n%40RN0GBj1vn$opgEY;paPz{=)RMwgMxxKQ+y>7M;|uUpQ?>3L zJXRA5@K+1RkF1vb!blkDZsV*19M*JMt*Zzy2huNQ&;U7~d-fPpfY+KGIoZSE>S1@5 z$E2nJxAk7AbTz74(Y}GWk0@bd3v#};w65*HuO$ocVlV4&r_P?<|F9Pv+x_h&+}CTn z`t8@#3h;E32ix1g{szJ50^HrxVQgnJ^PKPG0({)$GZhx*1*FmCu^e51i<|1&=J=gd zfRmfXrm&D+svISrblc$t~^d>8$ zp(=fvnp4%30vz7t7IZugTink}({xM${%`6{4pYyGPAtF!PQy*S^p(7WnpKT0z!6R} zU%Ioi7vAes7r)c1jtpM)6su%J z0lsYVoN}*n6;%|Z58H7(#meMeS%43ld@q=@C}+9Ii))vUEWnFRPM+R2xNduqG?^;5 zcAr{+3!9u<+jwBY*2<1Px&WUx4I-y4)n-|YE5Myi4^&}c;bvS$V+wF=Q`ZwlHf+YO zXIKIL?J}4M_=K|n-fU4o@Cm!1yZ|4z8|~mMg!7sUyE;31I_Y)aE*w*U&zhPe2a3Qk zxJ*VD;Jc<1cLEJu7UcyvulWdaVs;+^j%zxC%fIg0zoG#DHFX=)f9)!*EWmxuUTB67 z68_6oKB@r!H8}*ul+;U3W|zUZ0^HcPi`McnyNoIe@MYUap$C(zd~5-(Y}*%XI*eU5 z;|g$Q+Xr&`g6%6lq5xmEtFK!fsJs9Nwr6ZvAid!Qc&s_^o6Le}l|)m%4>%PXzgYEl zuF7`cV+PsV+VMt*209Jz+eWTEr_Jv;izZj*gkyPX>hU#W77$k6RC^xNg?8)gtbFEB zcOH2(!yLIz@l13yzM=q+^+e1^Tue_p2_mh1`1=pb@#cL3qeDfhom$(fetZGWX-W@D z7A}yMv$d$F*|uzO$Eu8>npBswU{V3j>Hm;s&uY!^0-V%zH#yCovx?CL_@xQw zDql@kbhd+O(rGcW0M|6(L8S#ojk9<}0sd%m3X5WA(WC-g(f=W7p4GhZ1$dx@ zOUThjN9H$(J7dF6ocoQ-ug7}~PS^{JavBZGA1*2N51LUl;D6IB^ z|8KnkpZ9se_ku44w+3$uUKTt(cyw%HY)DLteiQwBv^{#z|01sb690+*ZvVmlh0$k_ zgRc_4{O^tTj2EK!821Cqf4*^?u_``9IS%}RqvPjdeIXT}XY&9mn~4cfc~*HZe7!m( z5mr@o7jWv;#lKS4s}t3W)FYKs)#Yl77K}d|y-xjBeOG-!eL%fNJ6}6RJ39V`merOb z4q&D>Zkt?!YqcSIbMy>-5?K9yiXNrC9luW_X1~jg1xC^sZRq;vp%&m3UNR2SAJMmj z7KM_b%1|J-I99J;ub;11^Y7-b@(;n;zGmEG zTok{-C>mYHL5WWj&nGq|&X1fH=}BzB`pO)iFLG#58%%3kMmVeu7b`yMZUJpDFMKs- zJRz|9=UxRzuzEf3dXR!XO5U9RSgGyk)S4qwyzbt|A^pw;uM6p5j@2&p1LC=GtgAgB z8?Vk0EpBTbp(WM+J^}6zAd6zETlqMuRnn=66~4%!z96lRkJ6g|!}{KWh*n0$v<7$4 zaIM;2ceK|j-{!_!3ypZY33xTW%|xYPe!S8$+a7~8P!3o-;SgzcF>!CC#M0!>#E@Yx z+Hy0*n(dWD@PV~cbHSFm58Ugu>ST~*vW>l3Tg8{BpS9ZcQ7mQ2m091*+yt>|yJtun zDi&#%P<77b?XC?==`K4}{2|Cu#!fAt*Y0#^TWc?ZKTdQHb^$Jna%h=WXR54qY`S1d zaD-N8Ho{f1m!o>Cfc7|q*dDBJ8|%aC9=aEn8ivc_+GyKOxr6#kx+le>?~CFjA@ljta*KN^q!|7ko_FMvj4-X>^W=oyW9n^GR= zjP?WHwv-z;qkYd>4`@bX;-*xS8!@9XaT93ATyPofA6$b6E2DiQv~Hk`#>7oXq2)r! zXiVJXg~(`3+?4X*V>BjiN_oIB+UI;U4>Cq$;wGd?biraYCT>c3FfrOETtk%`2BLjT zQ?m;LGTZZ5Gh$vv$gA*s6{<&}|KwG8sdMyih}R~)b~#p7yE?mj@qlTf2B&kx1X_a} zGa~nxUddVzeK!Kkf;xMAu3D$b>i+Y^39`K?b6IwTNQIC?=3tQA9to2|P^{~*o0gHM_Xx*ShJs`AhM569z ztp|>%8$#>GBIb79hq zDc*y6`FD&7UW;*FMVVJ2`gpFfsTLVuko!ekhtYH$(z&`i;)O}oi|h;fsQ3-OO~|a5 zszFLVWMvTdt!b)?1&s?c;2A{HKhz;ft{VATW?CDOyQnIInTW4&gV5Gva>AXi5g9o2 zde){vWsiITpx+nws7`1bv(-q31M@c-cQ~txGGnkJNThrI8nmulVWJv7`|1rb}oTcngGE`fxf0 z$5DlLUHm8CAZJ*D&P+j$w=?}_dJ!}`2|!Zxo{tx52OjDg`RSrxofzyJh_xzs@Oddt zzk*BJ+x1IuQ9jRflh-S)Uw|Lu=!bqX{u;rqoVE@){jvOlCkMv!Nsck=h->Co#RReb zl@4_(JBU8Y`YYns_GLI&n=JKA1P3~HbQSTAOC6Joqm(9>4Bb2D^&@2@Z0w|5pkL)n z{F3+qIRHLSe3W=M@fKMAUQRrhcrx)w;z8sDxGQm6;>N@^i7OHpBRjy^K;EB}C?<|c zY)q_8bb$vjmq;O7zeiN6$oCjMCbAutEt8NVfdUHnR97dQ_bf+xn0!@58ZxCgTFLy=W*&-fxB z_IHTa#%IJQVbx$nd|*6`+ylRWVepIChq1R~e=!=2Dr2fK&Zsbk7%{`I|Em9}f31I_ zzpKBYzoI`2-hc=7E&3*~2V7|GzkPJ{S&8iS@;f ziEW7W#8$_a$5OF_V*AAQh%JiEjqMm~h*bmoFfledRu&r^i^T#lCHl|kchN7SA4lJf zz8QTr`a<-n=p)ewqFbW3M{kN=6TKXKhv!C5kDe4QAWq=$=$hzCWIsGOx=(cX=z{3Z z(I&(VOpi{8Rz`=~st64U z#lXn;Yw*Y5*TGMM?;=yfE5T=jj|CqLZV7G*-VnShcyaJNtS_AyJTAB~*n@SYZ1B+F ze!)G1i;%}*hhS}RMsN~vA|rwWgW;eS_$BZi@;iPQcsuYHusJ>zcsOuh;I6U?U}zv72n2lopZwqWKlQ)o zf7AbG|8xGw{SW!?@!#&h(fV!tAdf(Xh}BrhY4Pvx-^;%%I4FMOuk+9J zPeM$}Fn=6bBmRx`oiB_J`u*=wtZ?0hj1pHHmmtUFX~ywDv8*#Xj2!qY_BD1lb}@EB zmd$hYQ}rU^V0!g-AX^UB_tqEd^Yq{7wfc5o-5jY8(WAPq{i1!VeWtyqy@5QOPiqfr zf7I^qy^1`OQxw0klkY2_v6=&#szUB0<&IMRM#>$e++NBiDI2A1kg{INIw@5FZKgp%5Pk@xBo6 z3GuEF?+EdCA>J0^Z$i8!#G69AA;e#WcwLCU2=ST_uL|*JAzl&UWfBM|5aLA=h$Rr> zc_E$?;#nb{5#nhfo+5!r10fz2;t?Sp7UEArY!%`mAs!Us0U_=e;yxk%D8#)&+#|#m zAvTjh7=sXZkw6545O)Z1yAYd%xJ`&#Ng%L6h?|ADNr)STxIu{Pg}6?LYlXOm1cD%h zm?*>qA;t^AbHhS)toSvC!~%u8+X98V+X98V+X98V+X98V+X98V+X98V+X98V+X98V z+X98V+X98V+X98V+X98V+X98V+X98V+X98V+X98V+X98V8{n+eh+P!EX1geS&2~}v zn(d}uiRQ!U;DG)F@Stw5u;zS`%5aM_t`h+M7Q4k_8#Bo9#E5tEE z94*9ALL4c?5khPfVuKLtg*aS@bwaEaqF0C>A-aWFBSe=FokDa7v08|BAyx^oQiwJo zRtT|Nh@22vAzFpV2$2>dCB$Juvz7X7rntkVrU*`yM zwh(6tai$Pw2*I7G*>{@w#hs|xcdGbxiV)n1ntj}fntj}fntj}fntj}fntj}fntj}f zntj}fntj}fntj}fntjI_nxZrx!`q{IdlYYv-N@Swyj{=R!+E=ow`+OZ%iA8_ zcJp=(Z@YNg$=eRzuI6n!Z&&elC2!k!yMnjNd7I;Hmbb0E&G0tO+Z1mP<82FX59RG4 zygit=2l4hm-X6f){dv0|Z};WxKD^zVx663Dl(&2Fc2C~!!Q0(=yM(ukdAl2LccpFP zPQ2Zbx4+@-4z#V^p0`bO)5fYiCyiBkP8zFzB$OWt@d1fZD$hHkRGzCxskaCv&()*U zo9I`CI$wx+Ld+Fn4v8UZtq@5eYJ{j3qDqKaLd+yFP@N&fc0x=SVwwEJ!rS@0oyXg`yq&|_*}UDEx6QPTH1f8AxAnZO<83W(lf13rZ8dMJXsgcB zHJ>t*HZy3m9c`x5W*Tj#(q;;6CevmTZ6?xY0&T|AW*lwC(q;^8M$={#Z7OLqk~S5z zDW^>tZAQ>$IBkZ}W+-ij&}J}g2GM39Z3fULL7O;jVzi0UCPJGqZ9=pO(k4I~KWz-! z;M2mVXtYr^%@+zswpTj!K|W;VdoZ#&a%<$;$YuD>JR@>q5(UiS<|wSdlm^v43JutOM+vXiQWk zreFnNL}EZ9nDE7aj90~{#K++KeLy@I_r-pUeHHr%U+=HQo{v2qdk|6hx5loGT^73_ zQWKdL8HaD#L6I=B1O6QTCj1G$WM2=z7=9Ab2KR(F;XC$<@P)_^a5AFvH{vUHWjGx^ zFuXMWRs5s)+ws@p&&MB+KN#N}zcqesc-Qb8eAm{5r-jFb%fo}hVSLs89Qr2o3GxZN z9(pnKWN2&X9&i+1k4%FX;w$&$P(HLV)D3onG`?|{BJbdw(DukRFfBAF6b`AupTTzU zN$?$H9e5Gnyyd|sgZBilN7Vnx_@Z4IJP^Ew+am)(c`zLK8951GN4z*TGtUJ*PC z849|C>EKd)>(&Iv1qTJyz&C++@MXId%nR2CuE00#S%H%Sd1Nf;4y?o%?SX-%fn5W0 zkjt<}ze2wd85&O3^T8gq>8 z5wkH3t1#upAOx+c`p^0|Sc7>-e;qj$pVYVN_h1F)`q&w<6Ok=)eXI+7l843ikL?*- z7~4747^?!i!kE~I*nn6t=8OIq{R&YgZ%1E4CdtR64@NgfZ;f6Xy)1e`^o;0<(PNQU zvMahGdRTOSurDmcT1sQIDmn#OCPzdEU?s&D`7!cUL9-&M**QZ9tuiLe8v zg3D)1xwDk~wU2WC+K1$?eMtV=hvct)NdDS~Y(jmFko;8+$zSD={8bLgU*(YeRSwBt z<&gYUj&R!>`MC4d8>GBm%Il=OR?2InyjsdXNO_f%SF)U^Ucqv%dbyOBNqMQ1mq>ZB zl)snqA}KFq*`xkW$_u1CpJk_do|NZGc@E1q^=v86VwqFVl=2KIPiNVxo+jmQr972o zN1_V7NsmmnV0f7DUX%%7%7jI@+c{fl=29cOVo{0 zZjf?4ON4ewxsK&Rb*+@WQuavME#(?1yQJ)tvO~(%QnpLEO3IZ|wn@1{%H>k#q|8d$ zDrH8>w3I0+50kP*%0s0*M9PDuJV?p|r942&{iWPb%6+92<8h(7xBR_K%B50@@wreH z<8z_9ht%&bVWs$$$GRWWXp zsu;IPRgBxD+9daHl(K>4EVW+BI+ml<(Il0Bs-yV#NVSrG|E!MW-{oor|NcoW=iejL zGXDLeI)Z->Q-|~KAJk#|dx$!ee}Av?8k0Imk~&c9Vvb%%IBnfR?26j zd|Jwu?2vM`l zhChGL#CC~b{O|EC$mVxu{HS;v*z#t>?_L%+z?Sz??2q_DKL=lL z?f7nMj!lXMqn|{dj^2!KvhL{K(fa5Jc(C7y+>cd+e55t93w+Yy@Mqy?!?)sFy%%2Q z#&CJ)7jOhTh;Qv;D2E(=(?ZeU7s2O(R|gBhOmG)?e?!RJ_cU?>oEta_dHWWDg>Wdo zWM4(jzTf$e^zZGjGQPu?=$Y`V?qrPCKh$s0PeRth1^5Oo(-rMq?NNNm9gXj`?X_`O za{2`G+LdY^Yyn9%sJx>*sa&g^rF1KMD>XQA_rEbk1nN^voRbcgkrfNgV9C)%MCVh~ zUE6At5LN(GEQ^XFLh~tVPBOx}_pdA>BA?>fte84?`QRd=@dtxL0IaX7Rp;m;LhtFQ z4#rpaenX3hwI}WY4vn(+9A894eG+@RSb0n)FY~OX6cJBPF}mBtq*zUvQbZuV!_;&2!;S-0dD!MEE>K3EEM4ZiBH!#LaUh+4gMr25@5ctnwacOc7D@bl)6s zAkSSHQbe5mP+T8Deqx^Zs3HR6>F_3Q$XoT$B0}Qnx-ufkzOI!;1isUKw21q?%|_Ha zHQT|G=B>M|h#>dTsN14AQ7xAIsYQgcQwS`o-4+Fkc@pJC1h7+_=S(a6s9jM-5drHI zpV!s_)KYspQ-oHSyACZPSe-(xxI6b)`e8+crc;WG zh(4!qUKhSMX&z)u5n<VrpfrC3^*r~)@)aMCvyaNtm=vg zINwiJlxa`3t*)MdkggtL$mr-@*V(>yb(Ym7`ym9~wO`eLwcp4h;?e265Wfr_h8|C~ z6N@qyJx6#k5MgZNe`vT%QvdC%v(9Jh=_NJ(C-3O16{T??K2u@ z*3X2o%dWhLAb5(Z1#|6MaMDnR7-Cj3qKGhfijX%Mrh2TRF+~KxQ*>i@cFo$h?ksUh zc=jGsL@<1b31Wj+S+$HPA|#%oF_+GtJ#Wc;punx7p+&^Q)0jXIcz3UT;Ibm3;VEQs zF6q7PML4{xx`F1Y3@aiQp7MtvF0TWqJF8%55kc^j_64KXsUJ~9^gGohvimxV%8Cef zrzQ|~v2FRx4XfL&>dJ};a~EZ+SA#Fax!Qh zfKa~cBIXpeTjk|Ngt^ns<{ftyRu&QFPCKv2rrLW~Fdo`jKBkCBce+7demzq3mRmhL;iE*((1@3(eoqIBQ5U5Y?;@A-aXm&Qu>joPIMQuprrwOtx1-8XEP zhD-PT$}UA@y7xK|O%tbn+4dKucdqGe&Kqj!N_zyarGL6221uz-N`f!JeRn?r{vbJF#$aOe+Bp4u+W1ezfqkMV2{HW_*a2f_1^{VhgbS4eL~<& zeE>Yt%i)XOIZy-tvJM>eQ^qsK9bo6r!>9av|4II}+Ar`VFY)hWv>AIE4gMMa3V+1- z$@n1gCD;WYPF$Th9qS9Z#InRZV^E?#F(ENbpQ~pQe(lrv2VfiA1g~r{-W$)vm%__B zEj}_H)0gSV*gp*=_O;#zod2u92;3FBBzBVaN~}B98rv6`{0Xr{^m}j=JPFMG)zMR< zz0nrdk%pWXCKVUhRIl3LoQ@sBiCXwbPDN&)|U$<7F*l1@yPe+PMRM*Tjt0FTc ze(uCaLvlX)?gq#s&cBy~Uv0&jb_CZ%oaNxEzCET7S5-bPer@6dfXg+DJ$gY5reC68 z$+WU7Iy+aj$S28GhvE{eW7S-+6k zZrf2KeoxWQ5I?J{I{4@51NE_rDi=Oja~d0f#8ue;mXEU{+ugZpEtj7u~L+=%+9paW01p1g*#&(3<23K+s$tZx+;4=Nb^3ZRQ)$`(#0? zsjd+r-&r%?fL;^@*;G|7g&@vst65b+6tpJOO%0jGOs0ur;&F_;EI{00vO3#fyXVUrY2LGFa@pj>&V)4kbszDCP%tDw{h*C(C9L6`5H@buU*gVUAtX z47xSGx49czDmg;-AAw<@*1DLZ1CG%&Kei zTgh80*Wz;O={zFsazQO6Ru6&a;O=Z?;8I31i?RIO+%7H><>%t|?WZ0uE`lqemr^M% zf&%stkLJ?c`e^*KsKQfDTTSt|?ba;@29Ykf`HWR36T>$f`9y(%kGgf8~o$SmAg z5D~OZW4P0rOEKzpJT21XDLd>q9tWmkiEmRJ<3cfiH{$?fF%Pl5?2?BJ*Jog6hDxU7 zWLB^>zE8{}5gF4O-^b3M^OSDxI;&He8J&_4{08o7?VZc{_gwW7zVZ0YyMM&9q)Bfl zM%)eDc+#~KP0oDvdLGt}1gXkiQN6;aEM7Es{_e}>k7oAo_U!Ub_$dFx!_c{20W?X8 z4v3Nx9Z)4DIv`6*bU>Gs=zuUO(E(*rq65;TLNq34B$w+cIsQVQz zn$eT#ZtJ4O(besZJMqwP_nthM(k8IinZj4y}Wa?)@@-mWpRJFSO495t>!<9*;REN2{`B z03Pg$@Y2y(Xzu3u)akb47qPK?@!aa>9-cj%N;#4b;=}-U0V`;! zHm~7i4W1=jbv#!h{hWNkM{`fHH2eDQb1RnkZcE_RPO&VSyLimV-||Krz%RS3YhmI@ zN$9u6_g)1uF^JbmW`DG)4fplk&(}-r<={eB9^p3tq2~~O&{;D<)Qbvj=*(@mz%<<7c1)84tZm3uZ&D*Og5RO-#@ zChq9VGuavTq#!E3W*D9%N^Wg?I}&SvAYH74H+PCRl>U88>JFTXVB4N0b$h<&Sc_3U z7jJMDb+K}H*#9x$$NL{D=DM{nPzJ{RXh&9~dtf4*(y2u9i2}gZb_qFbLe4xHM4= zUZ2=t%mq`xAzCjY1F8}ghz9sF{uWT#58=E2viK44mGMKg@~?@PX}ib%6?-rC zB;o>0 zkq;3$e;4BAPl@zI4vx%6r1^c3>d53sxi&lE4}YW0Kur8&h#|N*{M+y`h#hDJE@5}X z2-Jit!ilhkc=z{1FN7WmZ3$f(Ix)09v_h*yp2PW}T72~nKy3Rr#_qv)w3so*(Dcvr zSJfZ&hrlavfqsI%PS5JQ>pQ6*A;aN#eE@PCexbb$l=;2?hky3}U(!5cu-mh{b7eNu zyUa|@yt1dW!&pfahB8|-hPbf@kzrWhc7nLr*j*S23VRqW5x+SHGwrmP2u0k?qsDH; z@+K!IV^?CY>4!qpSVUHmHq=;1EF~sYsIh=r;$i(Xb|D57FDSssP2k63jq3!aRZ z%L<9;wMW^Xm>f-m`R=Q#93z?}Qd--KqwkBOSedSs86Ji2cCVr!+97x0cAP=i#Cgm3 z3}*JH^%eWMy~^c|)^SQ?@yT{3(bt&unyDGEp1>cbM~~AM;dHqjEj`Gun(g6Tk?^90 zIu^2cZ}3_RGc@~Fr19`;;ivoYkm@ zk=gE@OQ@GDPHo`#0pD|jwdrWe47lQnX&lgt)$MiE?2hGa9qZMH={9!cdd$2zx6?K4 z@TPNkl6N3agYxZUZ7{V!Y_rVup*zu|q7LtJ~!IQ_ooH7Ot_z9c#i+Z5FKHXm);bt)mg{(Q@x> z>2Jg;m(u-_OLnNWvsd{C^>l|u9qmlp5}VD2ra#bB?+K(8Xhy-*Ei;JO-=QgdgjhL!9A%fmpR6$ znxp1WwkY^$_^xj!<{hcvJDYXb@cZ1~yo$ei6;IM_m(>cy(2MRziE@^0HH@DU*T!=05N|ZWf$Sa`ZBJX4f)ESN^=>R%6EL; ze|kSk-$OLPc`T2n_Pcak>2FIP;>r=FI^Q?cPiS|#WE+W(mwu?N!Zd^Br52!r=*!)A z7az%sMN(@@)Pz4$tA}ezr5oU`R8MwBYd6z1Q@?89nh8~9;cL{1q6$JF!&QC$-A`a|Ycxt8_BmTk%W%h;9`YTe~;VDSu70 z#9bS@#Jko^qpv-!}Dh*YReSq4nj7L{erVh1}S% zIvPr55e}qIpu?I9^$|X7XV+SQ7?CA*^m-8vpIQ;CAl`&LRNM-p{iX#o$D%r;(SmGyi>a5cE@DRf`y#g={@AHtcpS}mF|5~LR zs5i-9{Hg!0L%~fvnQk;&5Tjo&V5Dt$+;Gt;L$n#9Do4>qA|e;|F2DSH)CGh-wHld_ zcwTstE)^@$aAlqIm+v#{tx-*J8@jR`GuZPW-@;~gbu3q};5V_(-nN{~@yHi_BDKu< z)<@dIsby{@pT$f{ylUKwY=A{$xv|)&HAWIUzy7j*w|+S|)RrUmeTF_r`%-&K zy9WIK2ZH&3q83v>SO2Wu56u55>RNRlwN@Rbe5?E!Spv^f4p;V5>TtUM!@rSzfVdOv z*P3++tGv|&f{gA1tewF4&e_*xQP~GjJAuOmOmlUri{~G!hLL^1w9^3q4(IN|U}&p& zOrM0aS5?jENZ}O=1Bc(*?KYJ60nSd4Z|6#r*}#fEfZ7S`lwRAjA>Fy25B`u@I=T;t zc51$NdVJ8dsOST>o%XlRAE*C-Svsl@$aaFvJ5S$fP}v7qd+FI*6%6hJw4Fj6fb~{y zGpili2M{{}?Zt!2(vRo^e!UWU>oH&z4egsJb`c*kmVQVd!0Uwd7p@NT2$g++u1|(q z!brvYld}atu~Q3Lv!I7|>H%LTJ;6?UY<+njFzaKX$4E0jo~$;^>;qJN5v~%C>J6z4 zGa4!RaBH?9m2OP&6i9Ee>aAw$%KCs&A8lP$dZDt)#`Xb+POxin$!B1)!l&DEj}5@+ z4jW3bh*e3K&6qv_(Fuqz>yZFs=b=XQ0f1f!6R~W7qC3nMmiGa2PJM139<?=3h^#L7DSKjg2Y84La13tVAh31N@ zxz~_Bpu!0-N29IB!u<~I0}`Cz-k@(@*XGnS44lshSJ7b)7`PoWVd+QoNeH;OxXxY5 z`v3u_Q(TwAcPAbXw2o{xtE>+&aJumhXP{X&q7P7Tx*N8W&nznI0~DNgbFAUpWq^WH z*>Zc?+AJH}2Pio8lYUm9O`EblpuxE>@||`ycT69^;M|AWumqlJpV67graD|EBl>^` zr&eQCO6G4jYaZ4IG&rS7GxH#u1rz%K1E;6~eB|}>D713wl=lG(PM5N$ZFxruJ|bMo zxn?CJ`hfqY1Jld8yJ%D&u-`OmIbV;Q`ws5|{F}1iSsqxk)-ip6e$yEXCy>+EW13X- zG5#9^%Up|dRz0i__-{UGnXK5{ZDb#y-~1eKW?->SXJQ|)-*ipb2jXlvKihlEYR2>d z1x^iQJ6;cwZ!wlhc^{zQblJ$nTR5f&Y7>^guE z=Q<=#Q`BLVPwoRsobq$pm=9T-Y>mSbh;g#yizYHXi=<=Hvei81*gl}gsa>UCoR&>_ zA28%}3qw*GM;LKOY57m4qxt|ar$OTds+e_^^#Nl}69o+9arQIICiVegPN!sFXBW1{ zv>Ve0tT}ZpF6H%AS=BzK$=E&s>?>6G|oMwVBul*f||e*jU*FOYHzaci4H}`>kV6 z?*kNlu2mo3*peY=Sx+benobFJ#nJ6WL%z+H+1Mg5>h_6<2}RsuhYgVGwvF^GyXzTU z1YVuvK{@v##ZG!^sVD-oPVaEsAn!$(Tm*2Pdba2ToLShNN8Y^j6N*5x(}{_%O(gFX zpQYk(OH8xzMS$CrFr)BFd<*wq*~B8??sV<@XMW$!tZhsY5P0emB{cAs$=D(g@pP43 zX+QZYS@AyOia^NIaNv0nYgw69SW6Nuw~U4qftRP3MKZGEJ1dF+%G32*i&(@|t7oSv zML_0h3^`Ih(1K70KEOSu6-6NFsUprOC~t&y^kGF{>gi=gOq%xbM-&09r$-qj8+D)7 z)FSZp%_u@z+qSN33te)+BsVgk(qlWR2;4oz6Y}>h)-rmqG@iv>^j12u2rxc>^U#36 z`lI`pl||t4#l+0XO1d z;Q3s;n9}XqD~kZ-i#?sIw$}9>QUoBM?kCcm39eHB$P%&2I61)B3?rubR@et8M zCn(JvNR`Ed#pSVZKkl8w@pj*}O1l={KRyrae8bgv?4PlBV^74k#BPK?`@Gmmu|vRm z?~ncjCbnn5Y=2$!EHK&UqI)RcgKuphIM!Z4wErI>Cj_sEY|uAE+9C%i??+}wCPfnA zufuPKp9pUWUmHFTEPV%pU%p9sB|Hht^8V1L%9ha6SQ$7cba?0>c-F^-hKGE?Pr(&` zckt9;FL?A02+ju^{8(_ne;2ejzgO z9pYaA{<`VPb^f8ougY1*`^Iy|W~?3j);Q8wZ5)jCgE?417;6N3it);9Vc29Hae9`&fHLdkAR$^R*MS!?jjin4Pt;T0s3$ovgl!HHB-{bHOCgq3*5D ziGP;(8mlHxChksLnK&m=NVFvmNbHiRiocQ=7XOt%f<0OHG6MrcqJQrr2>81~j=k zr6`!sJGfrCxc$2Wmd=Pn=@EwYJmnaMx0r8Kwi|e}@;)Pd%n}#_DL;cDXb#;H-|b!% zxMUfXW?69`&Z%c`d!<&sH*lph8IkEN05ffW=K=Kb<<2HMe8ZrN8>R1{;7&>pu*j8a ztt!> zD0_`4GwOMYj=3{u+ z(U7I}S=_;Cj3hP{%||)P>0?p7OdN}M;2z$pp2{88F&oILrZeu(quF5lWhb)vW|%wu2;0xV;K z{c5CMM-3;xn`ey^lvs}4oIW;C^l_h-tC#Ad-2W_J+7PwMtpF1;1Jf;w$=t8RPjEFe zCed`bt?_+5SfA?iy4-l0^Sa8X=x2@6cT~3Ni;JM0l|I`W$KXP9ZPo3Lo2AzATx^!& z&M#CaaKANG0FplD>NTDN^hcedG`}9d}^i~A!#MWd==JsIsWgT0oq!pt3l}$CIz^ zY*V-JYk^P@XqPXMY_`0ov*Z_&Tr0uk@9UGF2d?E4b-7u&K<^T5DMhoHwI$|Lp9IGCbo}$!Zn4@}Wh@qd zGx{^~-o1uZf%}8G=#A0eBl`Zx_%mQ+-zB}oL{|<9{}TQp{5SQY;9rCBz_)?d{Kp0EMTWGzTJYzT3j-JX_YFR!E>FCt zuk_CeUJ%&me;ADTix7q2_kZZ0nRq^QoPSU#o7lzp6)gQbBA46Q;HrN-G&Z=Gakp`G z@Yvuj#;L{zqs3@8wlfAKCW9OBVeM+|1a&W^n7Ai#NpJ_PL)%rYPZYGMR;B+l6ji_0 z-&4mXIuZx!FRHJocLu-HchNO{it>x{s{Ua36=c%8BYbUeR`_>_9B2*i72Y8{IXpP@ zuh2W8`;iUI`H#R;v~~yN_q1|N&m5RMP=`_N9-wY}=T1q{Ds9YK0m1ufJ+t0a1&CWljGxK_$5^=~KcLd&SmKifirE!1-Lu(2^l#46*7c8B)ez>jGrg zXR=-7c;jjYff#!iIS-rER;?WRKtouPT)o6IWE-!#*+%BQ6WRd~Fk1(_70#oODnt)d0b^F0#Q?q+{T zxL$GoR7W3PtQy2mwUdY1ini`ne5!T#ZeaH(jC?;5^t*S3@?%IFuF&+;vmMuxT@8w2 z{8p2M4z~D2!ATDDtn!2XqNZH!_`Ave+jjUPZT; zYo{yd`{%F zd|`ZI?BB81V|T~Sj;)F99s3O!_jGXnKNh_zdR+9-=ni1~|1R=ksMqo?eyg*N2 zPq6%l@m2q@|8oD){)7CD{-MY{_ndK~aT0j`=Ne=5e<6$9-N>H41`+nt^`Q2?wpF`S zJ5oD9t4FBKSL!qB_38;~t2$d9rTkNQO}P^+|DDQWWhzeZfA}}%_}Kz(lx#?+YHE_1 zY^Fg{4VgfSF~^c0nk2K; zX)rZqlHOW?3}=&?#>VPgE(v}z$=77p0(>}|RAo{PRW(iZscOktWt#vcP9`-uoK00W zTc2$xIS{boY?4h^H8$2ZrmM1&$I7k+z;QOoG$2g0p|QFuS#m~zkF!ZS+0@#Ysj6#e zl-yQ!EdY`WlWIg})U?)DCrd6JK;>+bYRcB+k~P`Zq@?GvYXQETO`58~Bv+eGS5=po z0BX)AjT!J<(P^2?Ty`x$owG?prnWWRP?v1XNUAv71n6^NQk%&&Hq_SS(k1-`7<4wN zM|47UZL+bxs^q!=iY`o2jmccDI$NJAIcY%Bg-Km&b#+xkO)^<>r-4jole((fCUAP? zTB}N~E&%Fm0&cyARvf6Rs${4EpDs-5lC?GUtu?7+$r(wQdQELrHO6dhs=8XTo!Qp~ zFm8GBwpTjZF$pzWfTx|&o?T^jRU z$vu()_v&<0rV+=<)Rzu>32?7YC$qTExw`t&=@0;SK2SPYo5|*~b-AXJK?0CFo21av z>blmZs?u5jac7gJx+YNC)i%}El=NMo+=WSPsxDQNs;$kI^cR5Kg-J4(YR%QuAhO6i z?*iw}CYZpg8=7i!nZ^F5UjS?uCSVk7 zszX~!r$fNog-H_gcc!ks(WL*gM88>H z0o*Q3>YFglVTvi8r2uLdCUrGAJn>;xav;Fk*`zj`M2ARWIxH~(x?Pww)#IG;)T%3) z>m;zfI+@D0)-@!-xL7jR0ocy9)Zl%fx*>_DR!NrvuANQ5Y?;JkBwL>=nP2dZ!zNXY zwe&2(gRjH{Xm(*zovcqLYg=H~URnAF!c<}&HVY|cCE`v6`SCUs48noLd7+jskbTW1rR7_!O6TwTdH>H}zZ?u^XNX{)d`M|M_xl!eI|uRdBgw5-kV2BRb6f4b#L98C!7FjhGr5Rz^dvR zof-uM6%|DW$EHSTq3Na@5RE3p2;Ef~B#8q?jX0Ay;Y4tV;*_9KLmW{PLrhenMoIKd zNSwas?6dDs_cp%o`~C4--&#M>wRYFp`<`>|x#ymHhG#z;vwO>IYc=5NlnDwcm++A& zXY74pHPGs0lFH&WYbh5Kj$wB-uU$Qy-_`Vvrbuz&NOyx`2mW*RGTn+HL zG$~_rDP}5#q>^AHW3$Y3fYwENWr?5#Hu4*?8esL& zNXJfmM-l#SU>i1+BUS^iE_w>qj(`sJm;{J=wj);qu`clPx&@8{u*ED$pi)=f8SUJW>Vzoq?3H)&c8NV{-yu$J?b zt{uJ_Q1*U2h7E&ZtASw`DE>x&X+z(<8Zh>LYhai(tv=IPgD1@zoY8L$41>|DPnVc{ zUfMShZWvYvtez*`26QVMJkT&4wt8-VH)QCWSI^nQ4H+gQR?n6_#ae~{={}*~)Ueg3 z^;d|YZ(coX4}};eLGMD>HOiT;*!#e;zY=>Wc6;pF*!N-=#LkYj#tw?@8~rr;Hn{mW zMX!y13qAtz=-xmCJR7+=a%p4*Vz(a`Nh4x=H2fKM1YQLz-#uXE`+oSs@VVdxI4B$f z^Zv77-oGvM)6fq?-wG`XogSJIIx;jNG%WZ<@Xz20xHtHd;J1Sdyj{T~agM%MU^mXu zp9M3NL^So-4s2u+(#oXSyft8R3a}Jj5gL zkamOi9j!wFsZsF3 ze}p)KFDg$e_kYF40>Sv?2{av8NykC4NrpI<7Ny*&Au>y;>>;{JaV2QR7FCuY`Wt|C zi*Xnw_1%QM(?gLcpIUzQOjG_t@R9Qi-AjlMWg-Ecq{Fj%H<|KL=~CAh1fn~yvwKl> zap!qGp&Y?}oH5$eNrV;ZH!_>rIzgMOszUcah(M+u)oA_ILC4f1iR_wK0@Pm{eRJjMuKDDz0enUbY;&jXER%4F)*l3&-zP8eUB$plP#ZC*G&XLYDlI{R>X`aAf8nNpM;0GLCcj+rnScRNVFeH zIF7KS@`CP42}jthYjxd7;6s~Aw!sDhPe~QK%JsCmt|v%gLn?q5K&o`$s#cc-KQ^dk zt5m47+7)P)Tl-a@*3$_tZNH+`wVt5K2-KteTXqzEf}p-fpemj);15ksNo)k4;VpH2PKYzcL?9K>5@NO_H1tE9WD*0Yw-anjoKA`c*KX864GwaCJz<9H z&W7Jpl*p?>q_bc@;AMfJ?fQ4{rmY2U|cBEt0peN3%Wprz~pn`P0H&=t2MAe zamH7f7n-;g`BniXo=~Y;mJ3C<|AA-e9#nV?(}=E_YSNHltLr+mA`uMS!t*P8K*3pP(D&#H9cc!94bU0ISHwfwN+E?C<`HIu0hjOI}es_mFaonVAH!EU! z&5-%xeig|77#hW8Ub;iKK-hoUZ+ffiCuX-bO5pF_GV++TLa+wRdPcUYS{|s zSbw96i)c2*`lYV_kVlmG2^f11xs6EIaoOZo5RSLOnOsE-h>>{mT^Ra-5ERpxD`X}h zFhyXTn`q<~3>Q7eD6`2uh$(8+jTBMD;(Xo{n?~KllBD~i^N4g5eQ5WfpQ6;hO5N(Z zoZ70Nt7Y4qO`W_yHMcba1|Xaa3`!C;u}V3Td^(JjR@Y_JLY%;tb*cnJ;O)_07t=@_nE_ zAWN7h-v>Qqin5x#V&(OiV!$t8f4$dWgz2O?_%bIBYN=~CO=uBiQrS(@J&A>qU0EOo zbgb;X+S|dCl4P3n)-3)QMRQyqeMc5kTL!mCtG z`4A`Tk1Mw;R|MAw>xh?kj=B|o{Ymv+b%VRhJvUrL47>wz9{-tkfHnxH^dGz5bU)+X zO?4xAI16gVibum21GPX7zaD&^dW2XO#i3qKOx5dM+>6#rrVasHuxCA_!q z&%Uj`+kKb%zT;a4mViQdu5XraYFNV#!7#83e&YST_sP%)-aEWM^se-_d8d01@$TdK z)bn=emGER@3%K4>4?XJX@|^BD+A}fse&~Am_um#<3tU87Y+9%mJA`&b-i;oD$OR7r zA#quB|L8ZPi=uO*lOo@ZEQrjGOo~j5G=&$0&kUawZV3+*D2)oXw-YJzuY9~v%F;Hd zwm_z0^R$plmvK@lPH?oUNG+GM*+L?}|8o*u2j1T|NYXnoQNI<|G5To~;B``;FZ*78wEAJty76qW6 zVAA6~D41tqjDfd6k#;&3Cx^K6mZS-VF3{nwAezR*1;k3zqbscY zdf3+6P6gXJ)ovDu9-HNx{iMC#PukN0Z)Ckz>>j?{U*hisl1^G;8lwKP@#h_umcmz7 zXC8c5Ag3%;fcFbxb@TTS%0%+V;UwfB%TGLwTc|-vJ7MASqG+8X2D%f9Z1M@E&JK7O zQ={!q?JO-h8D7~d#1(@DNKQvJ0aS{|ek;}0?q#A35OnUkrQv*XHa(|CW14uJCZC1H zR|R=16;Yg=Vhe{=k@ORRi<3zvr59^n}#iFeT;AJr#C3<10U}ps`B2NP!e=DsL2;2pDyG}WuRsF zJ6j@KSOM)&&SfRqL@UbFWD;PEc(z=YU&#Wc;^-eJjeIUwl3&#Ml$y?i>NT6j_gj9c zDMUmCVGk3PYD>8+&q}p($TpR%v?PH=KuA&gj-D-30a{8Y^JO3|DD^B#Z2=4;UQHGf z8TlPOQ>Nzf_`D{8oRg)U!Kvv|u7U&q9Kiv!(24+%fHq%nV6eEkn zbgJ1Dnc7kJSG|< zEAyQsQ{#nH9t^(4w5&rbr2={bTv@ru5KZkUN{y$AqVp7RFI2N5WoiPhDoIRga&&mD z9U&OvODn3%{gEb@W)4;caUq)9lc%?rh8v=3Y1m%#qQ@r7#cEuluC&Ee*9x!_`C=*8Qi$WjF1gpWMRY+q z1t?6RC7DghCO?-_(GRkTa-sqqJ)U-%nk}bFEon@4W$HrgV|`Isxv;$`g2{-HRB575 zgf;10`b3y1G^WlGH)UKYE^HT$I@Csc=7D}hjDKV!4+0>@R|TSn4AZ7n&~w8&a0vvDAmF zu3TfzbBs5R@*OM!bjW-g6bq=gQEe^hl>f!%t7WLfJzs4pLpZL;@B&Z_vXo&}R4rwg z=~TwIg%5(PmTe@US`QSydwWpR^{dP_6xYjn+YgcQ^iJrB(E89tp)*3+ z(7xdOdp>wuurF9aJiQTt&jPOnHU)kh=n9;O6}->?7yo1apZdSypXX2e_x63{d)D_e z-x^=ZH_125`ycPC-utjJUxM@d@rWn*mgiB=HSpe_<7x2>z-j$6+O6RHFK9<;P43+| zr@zO2se7^eIJaAU44ize>QLq1VEMmSS*vs?$1CF$4Y%cTHTN?18Dl^ei%Kju z&FW?Bvv~J&`3f-iMH&OFCX9W~wgA_RQ9O@8$zt%ZnlSb`o5)oFy#=z?;ULh<*yn5_ zT}&iURLKDj?PcsUR=;I6kaJ026sP!CDu_K4;?qffZV^m2BD$ z6YFK{a~4Ro0=|ui?Q91g_A>T4Qw1!yP)wFu>;@<+4=a5Z?wTe9+RuLx%=)^ByMm0#@DAm_tijpofzz7lRs%pnH_A>H1lNSNFG1W???D)Q3MqXpGQ%L3#g=$<6Nw1@entK^} z4fuCFldLAIm8zqr58YHO!{-yhmj|faYFCUT3h^BsQ$l zsf-=p*UQN33^tHb8Q}dBB^v~@xtEdG8Gw3$7)@5<4y zjJ(bO>nvuDscg|v7e-!Z;y^;DE9oSFr}pYH@;Vbwr*h?ZI-Yjcg^|~AZUEX7v)lq+ zL0k7``}Z>PI*r9;DxJ>7s}8@JUPfMH&6G_S@G7P9_K{%?Bd-BhFIVGOaOGR< zZ@?NxUZ*p7ere%>)?)txtzqPK8ev9KrA(oca}4Qg7919qEoldpj zLzsyJEpC4RYZ!T*Zo#^)l1?Szu43yiYZ!T*Zb=m4ae$clB(L zm&O);RjxTL-Fpo~uTvP6Nk=XWy@o$zwE}e!E(-Qs0KFE^2+l}wtwCk6fnYZQ23wjGs>xC+ z3oi#pL4aYi3APl_Zb1Coa{(e-nq;fFOi@(D@u~rwElo1HEC$R}DsTV7t^q`wOp4`V z3I{FKv>or?yapI;X;KtNH}Dd1`iC$?J5|gV(87gEvEq2rfM`=L=x>D=5iIdW62F6YnK8s1fNPTp_ESpfJT`m^j@KSo?FN%|wR zpf=@_EM$dSDR$Nzxd5pxP2fX<*9fDyqt`K5JB8;5XIr@b#vPCGRL&)V=|T}_ehJ6d ze$6Sm3H-{^$#^+iay+A%x=Bm2iXjSaY>vU>WHyQCvD^`dfX?ckq?=$JQb=GYE#-LC zPLw7s7+KPlQlW|+O8Wzt!6ubL3#OOi+|OZhf^L#br0{vfl-BX2k7pBXD`M=xjJW8y zqvP15gdIDqiG*XRy)M&r6YS)|F(!p`QoG4CHYujl7^mX7Y{D^09m^)zRTl1*iG;K7 zPSs5k_;?l*#fsA{Y>IAz&q%hMFQ*+YFKZ^VNv;Zy-z>69Iy&Yth6$JrC>0tNiiF(3e+2&+e9C{Bf0gHT&tpK(U+P)mIomVEbFgP`?cdrC z?bq6!+U44XS_u*O653#Ym-|cqeE$shJMQP)_qnfjUkv>GOn;N_J>PG9cl)k(XMNwq zdHihOWM9^Ipl^8KU7yGM5AP2D9|A{ve+S(Do!)ici@l2x^>0#OVc|pFq{53Eu`rGIO*rTXNI|AY8jOd}!0g;dWA4Xn4 zoWd(2J&}d(;cgFb3oohl0bgcq|Xa45_f4%tLX4u4p)%hvN90)}j8d&*yRBaWY5S z5j_;srNVYf55+X8upQJxA;SgO&+4I=DzC6@&_gkW6^(oJP)ue;<2F4M$4G^3ryh!< zrNXvZ55*)_H15|!(JB?TEqf@Ak_y|dJrqZ>qH*IMiX%u-s#fBe4AwdMJdZZo;Zjk- zK2iw?i(HAn1KMFyQ3kyPoawNx*RRO4B9FbCEY=|MkOXB&XAI<$i>K4^Qar(Lu9lTo zU`&S7djcyy9(J{iR1`6-$2txR8XgX`G%IitgdsMAwSyc4w3JkcjV8>4DhYiKqqVRi zlgt$`eJL3?2=;YA*Gi&b9N%Ev=RG4WArL=bu2yU-@EBGFPR!?h7kp?n{QNJRz?lb9}~i#qFrb}%av zm}j@N6w3PiRy#;4(pC7cg6zXsoM;E?ic%_7F2l85FJn9_;GUl;R^q9+-t6O~0!IzG z9LDL2JZr!cJb)GXY#viTIAZb_UmGhGIC0Dr($!o--zU_@NCntD&_VFec(kLXB2g^m z)0nAeu**ivb8QqWQsq(wy9A)3V8uwOh-0HMm&~{1@;u?zn#nnUBU!3jh`5`n7wJ@X zAc5%26C&C?p03U$0_MplpLE)(#~m~KwBt^ihQNEF1YzX})4Mvs}+oQ%|0L^hwjE&Nx{#-#!EoL^c9?th2#OP{WDp z`PATGOGC(QAW9|KSnFwoq;5#%2Xrz4bfu;tYJmX#w5a*Gb~avI%I<&Usg-kF@ZUIV zWeFB5=qG`ZqCM6*t_KONtEVk>0a6XGhf)EJO-=s_L4J$YD7EUd`)K171p!#Gi!1Oa zXsA>^v<@-IgkWSa6Gb*AFt<(01Pc6rb`U2UcZY$U43sB)rItmXtv0AK6^Z+&SasDj06 z8XJ9aY&ja^{cu)@rD_r?oex19CKcHE6^I1@1N3kFP|!aPQj0hQ01^S8E`7&VYm!%B zMV!XwX*Ma($I%Ew2pwE3687 zXz+3Mchn9hL~x_}OKM3YWw?3=JqMZ45TRIo*s8H$EjOwU(f#l>68k3rh#S=h_tg$m zEbvM(-iMMywY)Xain+`kP7aIwJ~g^;tFO`EsOw~L9XJjWxvEd9+v%IgQJ+;r(V5_K zLQJWjlq=Je_sK1TK9);eGO&^rXF6HEW-o0ts%b(^ThF3^A^>|FtK2_Io2;mlX&^Zk z`ex)`;Ba~Koq)-%Zwqdz5oCuWh)mD2zhPf^O& zk}YE(mmIa0Y*V+MVJ*2q$t9m^E!ko~C6}n*aka$w%0-6gV`@uZ>Uv#%9nImGZho%( zI$Be?>{G~(%aTnSh6>s4Tu@|$){2k4d2ORb>*?0pqXR`F2k}@QcRfwxdA}LZ9Tu%^ zOBr+;e6M(_VQbsk)UETZO=nS3#sxXLn>DA@`4lcfR;P6ic}&>ZmzTO;3;O@y+M;Y! zL)$`+h3*O67`iO9IdD7ir+KAdp)az3$P2YK)Xm=pq-)}u8q}V z?tg<(|2g+B+}FFm>t60|!)bhr@}hef{OnH+p6NL{c)VwVXQ(HreX4z=y@g$apCgvu z-{DK}lzNx;WB)Vo?cWg0`>*t`_ODd0Qoo~i_}l$w_-FW!fUo~B|9-xIfgkYKzKy<{ ze3$up)#H8Nz%Ii4;8n_7zEgt-`_jH~(A}kNy68xUGsvhn= zM|li83deaFV7p+ETBT`~ZbX0V&s4MbO3MMgyifGP1`*hP3F{CqG3%*2N9)nG^X7LXI=@GRw{@Zo`v!_8rT z=%dh^fvW>+0~Z9&4YUPL2xJ0d0x|!8@M!2?FzpI+Y_tu6CKTVM3OvRHSFm=Yz#1*= z>|6xeaYQ!7#A3Yw@W{h+5F2aP2`Co%Tx$1dR|^bC2ME{;7R1$01ZC%9WQu`TTT4F@ zaS=9NyHsE;+m~P-0djx*{((?}%!DkzFUsN28nIK1Wp|!-BVHsk$~BCK4RDVY#s=qVhd_~;3G`*@6)&WohVHB^ z7I1DPh`$#JgeU%1=L+C6{O~GEhJrd4 z2MM|B9npv~*%FujT2TvvS@x)RTK=9QZlRIdS80}I>F|6}e5V*EOf%WYX9)ayds*2f zl*dgjES^eLChu6++cY#_p(ieP3Co4u%10#Il@BdL1zbOVCTtNI2Uyk~Wr=ts{9~!8 z9SGeQFIz}!738Ik7S|d+O!N$`#jN zgja@4Cukk~A=-&6-}Q*NS5qTFb5Dt`C=+S1g#ZEM1WX>+PYN_GDMd?kh`YmB-L-J( z;$x`lot+B+zC$Z)5RYX6#!}qm!JSZ$BD{nUbcKuo0xgJNt^%h;+URexwel)}x4L@Cf5;x4Q zn697Et5?BsB0C2w!|Bztq%5J=j1xqDKeZ*ec8Fe#94QmoVdr5HHPGq~frg<-1tNpx z;>lW-B5_$iiLUoW^{kfad|_q_QRe!sfTP+1l%>VTSB58hQnZ#OHrc)6yn9-DRyGtbfi0vo?%gv*JQ9Z2c_ur?1kW+nj_o zV0upf{YdGdLJQsSn3tc1+eMwQ|B4R`9#k`TGci|H4-tJz^f{`;DC;lRJz@7STqbqP z#M>i(P~qesBYtCsAn1o=N$+vq^bzW|{BZqM3_l%((u7VLFK-h%#L}T3KNTHS2G()y z6unY+r4W^J-6kp}QWlGW_UED=i`zT!d7uyhr-<==#&MIUo-}Lfh=6-Pb#Y}ur}~6w zf*F(BPMkVx*3r|Z&QdX+H6{$TCk(MC47Mi>v?uIqPuSa@FugT?EM@iDq?Z0 zbUkWM_&JS)OICEkg_oz4XNk^a%n_8O!mpTCNr-KNE;Cv5Azn4nB2AqtQ;6@8&Ir^a z#1{nI5e*EGZ_^Bq6Y;@e(#OAuKGzN`^-4MYctEt3obibs+AXJa`s|V3q>-Xw%;}>@ zqe;9qiQc0#gTYBk(!IkK+a245llC34?XhjKt+6e!&9RL*abF)>2k-a3*ea}$yJ8Dt z^AR6lW^8(FQY;sX$HvE+V}oM@Vt%ZZcSm=@YhXuoJ3QmJMz=&aM>j?{MAt{xMb{## z;Hv1#XjgP$bUru)XCkJ+q-YLYg5#sj(ZSIHQ9oAFyCb_IJ0m+H+u>`lHL@kLIkGXb zA+kQQF0wY#7g>eagI$q@U>uwmnHiam6?QHXkBkTR;9#t>{SjAqcX$_8+B*=Ba9c1J zj0eXDn}dUc1A_jb3#@{>0y_gc0^0-IaE`wvusN_XupzJ>>;h{8eTYo368;Gb1M>s( z0y6{C!8MQz!~^4T%0D-=l|eTXu+ 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 Date: Sun, 8 Dec 2024 17:41:31 -0600 Subject: [PATCH 17/17] Bugfix --- app/api/admin_sales/events.py | 2 +- app/models/Communication_Context/mail.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/api/admin_sales/events.py b/app/api/admin_sales/events.py index c9a0a67f62..5384a64c24 100644 --- a/app/api/admin_sales/events.py +++ b/app/api/admin_sales/events.py @@ -126,7 +126,7 @@ def after_get(self, res): methods = ['GET'] decorators = (api.has_permission('is_admin'),) - schema = AdminSalesByEventsSchema + schema = EventInfo data_layer = { 'model': Event, 'session': db.session, diff --git a/app/models/Communication_Context/mail.py b/app/models/Communication_Context/mail.py index de5ead9c10..4c819ce0cd 100644 --- a/app/models/Communication_Context/mail.py +++ b/app/models/Communication_Context/mail.py @@ -3,7 +3,7 @@ from app.models import db -class Mail(db.Model):\ +class Mail(db.Model): """ Represents an email record in the database. """