def __init__(self, id, **kwargs): super(Artist, self).__init__(**kwargs) self.client = CopilotClient(settings.COPILOT_USER) self.id = id self._get() self._assign_assets() self.events = EventManager(self.id)
class Artist(object): def __init__(self, id, **kwargs): super(Artist, self).__init__(**kwargs) self.client = CopilotClient(settings.COPILOT_USER) self.id = id self._get() self._assign_assets() self.events = EventManager(self.id) def _get(self): data = self.client.get('artists/{id}'.format(id=self.id)).json() props = ['assets', 'bookerSimple', 'stageName', 'web', 'shortBio', 'longBio', 'facebook', 'myspace', 'twitter', 'mainact'] for prop in props: try: setattr(self, prop, data[prop]) except KeyError: logger.warning("Property {prop} is missing in copilot API " "response for Artist {id}".format(prop=prop, id=self.id)) def _assign_assets(self): self.media = defaultdict(list) for asset in self.assets: for asset_tag in asset['tags']: self.media[asset_tag['tagName']].append(asset) def news(self, page=1): kwargs = { 'page': page, 'references.type': 'ARTIST', 'references.id': self.id, } return self.client.get_paginated('news', **kwargs).json() def videos(self, page=1): return self.client.get_paginated('artists/{id}/videoEntries'.format( id=self.id), page=page).json() def records(self, page=1): return self.client.get_paginated('artists/{id}/records'.format( id=self.id), page=page).json() def images(self): for asset in self.assets: if asset['mimeType'].startswith('image'): yield asset continue
def render(self, context, instance, placeholder): client = CopilotClient(settings.COPILOT_USER) context['news'] = client.get(self.endpoint).json()['content'] return context
def __init__(self, artist_id=None, **kwargs): super(EventManager, self).__init__(**kwargs) self.client = CopilotClient(settings.COPILOT_USER) self.artist_id = artist_id
class EventManager(object): ALL_ENDPOINT = 'events/' ARTIST_ENDPOINT = 'artists/{id}/events/' SORTING = 'dateOfEvent,asc' FROM = 'from/{}/' ARTIST_FROM = '{}/' TO = 'to/{}/' ARTIST_TO = '{}/' def __init__(self, artist_id=None, **kwargs): super(EventManager, self).__init__(**kwargs) self.client = CopilotClient(settings.COPILOT_USER) self.artist_id = artist_id def _get_from(self): if self.artist_id: return self.ARTIST_FROM else: return self.FROM def _get_to(self): if self.artist_id: return self.ARTIST_TO else: return self.TO def _get_endpoint(self, **kwargs): if self.artist_id: endpoint = self._get_endpoint_for_artist(**kwargs) else: endpoint = self._get_endpoint_for_all(**kwargs) try: endpoint += self._get_from().format(kwargs['start_date'].isoformat()) endpoint += self._get_to().format(kwargs['end_date'].isoformat()) except KeyError: # no problem if start_date or end_date not given pass return endpoint def _get_endpoint_for_all(self, **kwargs): return self.ALL_ENDPOINT def _get_endpoint_for_artist(self, **kwargs): return self.ARTIST_ENDPOINT.format(id=self.artist_id) def _get_sorting(self): return self.SORTING def _get(self, endpoint): logger.debug('API call: {}'.format(endpoint)) kwargs = { 'page.sort': self._get_sorting(), 'external': False, } events = self.client.get_paginated(endpoint, **kwargs).json() events['artists'] = {} for event in events['content']: try: event['dateOfEvent'] = datetime.strptime(event['dateOfEvent']+event['start'], '%Y-%m-%d%H:%M:%S.%f') except KeyError: try: event['dateOfEvent'] = datetime.strptime(event['dateOfEvent'], '%Y-%m-%d') except KeyError: pass for cast_item in event['cast']: try: events['artists'][cast_item['artist']['id']]['events'].append(event) except KeyError: events['artists'][cast_item['artist']['id']] = { 'artist': cast_item['artist'], 'events': [event, ] } return events def _get_years(self): endpoint = self._get_endpoint() events = self._get(endpoint) years = {} for event in events: try: years[event['dateOfEvent'].year].append(event) except KeyError: years[event['dateOfEvent'].year] = [event, ] return years def year(self, year=None): """ Return events for year `year`. """ if year is None: year = datetime.now().year endpoint = self._get_endpoint( start_date=date(year, 1, 1), end_date=date(year, 12, 31) ) return self._get(endpoint) def prevnext(self, year=None): """ Return events for year `year` and one year before and after. """ if year is None: year = datetime.now().year endpoint = self._get_endpoint( start_date=date(year-1, 1, 1), end_date=date(year+1, 12, 31) ) return self._get(endpoint) @property def years(self): try: return self._years except AttributeError: self._years = self._get_years() return self._years def all(self): """ Return all events. """ return self._get(self._get_endpoint()) def upcoming(self): endpoint = self._get_endpoint( start_date=datetime.now().date()) return self._get(endpoint) def __str__(self): if self.artist_id: return 'EventManager for {}'.format(self.artist_id) else: return 'EventManager'