Skip to content

Commit

Permalink
Merge pull request #52 from realifetech/feature/CATD-89-campaign-auto…
Browse files Browse the repository at this point in the history
…mation-service---sd

Feature/catd 89 campaign automation service   sd
  • Loading branch information
ndy40 committed Feb 8, 2022
2 parents 52cb7fb + 6c1c118 commit 7cfd186
Show file tree
Hide file tree
Showing 15 changed files with 819 additions and 1 deletion.
7 changes: 7 additions & 0 deletions livestyled/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from livestyled.models.push_broadcast import PushBroadcast
from livestyled.models.push_consent import PushConsent
from livestyled.models.reality import Reality, RealityType
from livestyled.models.screen import Screen, ScreenTranslation, ScreenVariation
from livestyled.models.season import Season
from livestyled.models.sport_venue import SportVenue
from livestyled.models.storage import Export
Expand All @@ -54,6 +55,7 @@
from livestyled.models.ticket_integration import TicketIntegration
from livestyled.models.user import User, UserEmail, UserInfo, UserSSO
from livestyled.models.venue import Venue
from livestyled.models.widget import Widget, WidgetVariation

__all__ = [
App,
Expand Down Expand Up @@ -103,6 +105,9 @@
Reality,
RealityType,
Season,
Screen,
ScreenTranslation,
ScreenVariation,
SportVenue,
Team,
Ticket,
Expand All @@ -113,4 +118,6 @@
User,
UserSSO,
Venue,
Widget,
WidgetVariation
]
72 changes: 72 additions & 0 deletions livestyled/models/screen.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from datetime import datetime
from typing import Dict, List


class ScreenTranslation:
def __init__(self, language: str, title: str, **kwargs):
self.language = language
self.title = title

if kwargs:
for k, v in kwargs.items():
setattr(self, k, v)


class Screen:
def __init__(
self,
id: int,
screen_type: str,
reference: str or None = None,
translations: List[Dict] or None = None
):
self.id = id
self.reference = reference
self.screen_type = screen_type
self.translations = []

if translations:
for translation in translations:
if isinstance(translation, dict):
self.translations.append(ScreenTranslation(**translation))

@classmethod
def placeholder(cls, id):
return cls(
id,
screen_type=None,
reference=None,
translations=None,
)

@classmethod
def create_new(cls, reference, screen_type, translations):
return Screen(
id=None,
reference=reference,
screen_type=screen_type,
translations=translations
)


class ScreenVariation:
def __init__(
self,
id: int,
screen: Screen or str,
priority: int,
created_at: datetime,
updated_at: datetime
):
self.id = id
self.priority = priority
self.created_at = created_at
self.updated_at = updated_at

if screen:
if isinstance(screen, Screen):
self.screen = screen
elif isinstance(screen, Dict):
self.screen = Screen(**screen)
else:
self.screen = Screen.placeholder(id=screen)
125 changes: 125 additions & 0 deletions livestyled/models/widget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
from datetime import datetime
from typing import Dict, List

from .screen import ScreenVariation


class Widget:
def __init__(
self,
id: int,
reference: str or None = None,
position: int or None = None,
content_type: str or None = None,
variation: str or ScreenVariation = None,
style: dict or None = None,
view_all_url: str or None = None,
widget_variation: Dict or None = None
):
self.id = id
self.reference = reference
self.position = position
self.content_type = content_type
self.variation = variation
self.style = style
self.view_all_url = view_all_url
self.widget_variation = widget_variation

if variation:
if isinstance(variation, dict):
self.variation = WidgetVariation(**variation)
if isinstance(variation, str):
self.variation = WidgetVariation.placeholder(id=variation)

@classmethod
def create_new(
cls,
reference: str,
content_type: str,
variation: str or ScreenVariation,
position: str or None = None,
view_all_url: str or None = None,
widget_variation: Dict or None = None
):
return Widget(
reference=reference,
position=position,
variation=variation,
view_all_url=view_all_url,
widget_variation=widget_variation,
content_type=content_type
)

@classmethod
def placeholder(cls, id):
return cls(
id=id,
reference=None,
position=None,
content_type=None,
view_all_url=None,
widget_variation=None,
variation=None,
)


class WidgetVariation:
def __init__(
self,
id: int or str,
fetch_type: str or None,
widget: str or Widget = None,
content_ids: List[str] or None = None,
reference: str or None = None,
priority: int or None = None,
created_at: datetime or None = None,
updated_at: datetime or None = None
):
self.id = id
self.fetch_type = fetch_type
self.content_ids = content_ids
self.reference = reference
self.priority = priority
self.created_at = created_at
self.update_at = updated_at

if widget:
if isinstance(widget, (str, int)):
self.widget = Widget.placeholder(id=widget)
elif isinstance(widget, Widget):
self.widget = widget

@classmethod
def create_new(
cls,
fetch_type: str,
widget: str or Widget,
content_ids: List[str] or None,
reference: str or None,
priority: int or None = None,
created_at: datetime or None = None,
updated_at: datetime or None = None
):
return WidgetVariation(
id=None,
fetch_type=fetch_type,
widget=widget,
content_ids=content_ids,
reference=reference,
priority=priority,
created_at=created_at,
updated_at=updated_at
)

@classmethod
def placeholder(cls, id: int or str):
return WidgetVariation(
id=id,
fetch_type=None,
widget=None,
content_ids=None,
reference=None,
priority=None,
created_at=None,
updated_at=None
)
68 changes: 67 additions & 1 deletion livestyled/resource_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
PushConsent,
Reality,
RealityType,
Screen,
ScreenVariation,
Season,
SportVenue,
Team,
Expand All @@ -49,7 +51,9 @@
UserEmail,
UserInfo,
UserSSO,
Venue
Venue,
Widget,
WidgetVariation
)
from livestyled.schemas import (
AudienceDeviceSchema,
Expand Down Expand Up @@ -90,6 +94,8 @@
PushConsentSchema,
RealitySchema,
RealityTypeSchema,
ScreenSchema,
ScreenVariationSchema,
SeasonSchema,
SportVenueSchema,
TeamSchema,
Expand All @@ -101,6 +107,8 @@
UserSchema,
UserSSOSchema,
VenueSchema,
WidgetSchema,
WidgetVariationSchema
)

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -1455,3 +1463,61 @@ def get_exports(self, filters: dict or None) -> Generator[Dict, None, None]:

def update_export(self, export: Export, attributes: Dict) -> Export:
return self._update_resource(ExportSchema, export.id, attributes)

# --- Screens

def get_screens(self, filters: dict or None = None) -> Generator[Dict, None, None]:
return self._get_resource_list(ScreenSchema, filters=filters)

def get_screen(self, id: int or str) -> Screen:
return self._get_resource_by_id(ScreenSchema, id=id)

def get_screen_variations(self, filters: dict = {}) -> Generator[ScreenVariation, None, None]:
return self._get_resource_list(ScreenVariationSchema, filters=filters)

def get_widgets_by_audience(self, screen_id: int, audience_id: int or str, timestamp: float, **kwargs) \
-> Generator[Widget, None, None]:
payload = {
'audience': audience_id,
'timestamp': timestamp
}

# add variable filter arguments that may be passed.
payload.update(kwargs)

try:
response = self._api_get(
'v4/{}'.format(WidgetSchema.Meta.widgets_by_audience.format(screen_id)),
params=payload
)

for item in response['hydra:member']:
widget = WidgetSchema().load(item)
yield WidgetSchema.Meta.model(**widget)
except HTTPError as http_error:
if http_error.response.status_code == 404:
yield
else:
raise

def get_widgets_by_screen(self, screen_id: int, **kwargs) -> Generator[Widget, None, None]:
response = self._api_get(
'v4/{}'.format(WidgetSchema.Meta.widgets_by_screen.format(screen_id)),
params=kwargs
)

for item in response['hydra:member']:
widget = WidgetSchema().load(item)
yield WidgetSchema.Meta.model(**widget)

def get_widget(self, id: int or str) -> Widget:
return self._get_resource_by_id(WidgetSchema, id=id)

def get_widgets(self, filters: dict = {}):
return self._get_resource_list(WidgetSchema, filters=filters)

def get_widget_variation(self, id: int or str) -> WidgetVariation:
return self._get_resource_by_id(WidgetVariationSchema, id=id)

def get_widget_variations(self, filters: dict = {}):
return self._get_resource_list(WidgetVariationSchema, filters=filters)
7 changes: 7 additions & 0 deletions livestyled/schemas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
from livestyled.schemas.push_broadcast import PushBroadcastSchema
from livestyled.schemas.push_consent import PushConsentSchema
from livestyled.schemas.reality import RealitySchema, RealityTypeSchema
from livestyled.schemas.screen import ScreenSchema, ScreenTranslationSchema, ScreenVariationSchema
from livestyled.schemas.season import SeasonSchema
from livestyled.schemas.sport_venue import SportVenueSchema
from livestyled.schemas.storage import ExportSchema
Expand All @@ -50,6 +51,7 @@
from livestyled.schemas.ticket_integration import TicketIntegrationSchema
from livestyled.schemas.user import UserCreateSchema, UserEmailSchema, UserInfoSchema, UserSchema, UserSSOSchema
from livestyled.schemas.venue import VenueSchema
from livestyled.schemas.widget import WidgetSchema, WidgetVariationSchema

__all__ = [
AppSchema,
Expand Down Expand Up @@ -95,6 +97,9 @@
PushConsentSchema,
RealitySchema,
RealityTypeSchema,
ScreenSchema,
ScreenTranslationSchema,
ScreenVariationSchema,
SeasonSchema,
SportVenueSchema,
TeamSchema,
Expand All @@ -107,4 +112,6 @@
UserSchema,
UserSSOSchema,
VenueSchema,
WidgetSchema,
WidgetVariationSchema
]
Loading

0 comments on commit 7cfd186

Please sign in to comment.