def parse_episode_action(action, user, update_urls, now, ua_string): action_str = action.get('action', None) if not valid_episodeaction(action_str): raise Exception('invalid action %s' % action_str) new_action = EpisodeAction() new_action.action = action['action'] if action.get('device', False): device = get_device(user, action['device'], ua_string) new_action.device = device.id if action.get('timestamp', False): new_action.timestamp = dateutil.parser.parse(action['timestamp']) else: new_action.timestamp = now new_action.timestamp = new_action.timestamp.replace(microsecond=0) new_action.upload_timestamp = get_timestamp(now) new_action.started = action.get('started', None) new_action.playmark = action.get('position', None) new_action.total = action.get('total', None) return new_action
def add_action(request, episode): device = request.user.get_device(request.POST.get('device')) action_str = request.POST.get('action') timestamp = request.POST.get('timestamp', '') if timestamp: try: timestamp = dateutil.parser.parse(timestamp) except: timestamp = datetime.utcnow() else: timestamp = datetime.utcnow() action = EpisodeAction() action.timestamp = timestamp action.device = device.id if device else None action.action = action_str state = episode.get_user_state(request.user) @repeat_on_conflict(['action']) def _add_action(action): state.add_actions([action]) state.save() _add_action(action=action) podcast = Podcast.get(episode.podcast) return HttpResponseRedirect(get_episode_link_target(episode, podcast))
def add_action(request, episode): device = request.user.get_device(request.POST.get('device')) action_str = request.POST.get('action') timestamp = request.POST.get('timestamp', '') if timestamp: try: timestamp = dateutil.parser.parse(timestamp) except (ValueError, AttributeError): timestamp = datetime.utcnow() else: timestamp = datetime.utcnow() action = EpisodeAction() action.timestamp = timestamp action.upload_timestamp = get_timestamp(datetime.utcnow()) action.device = device.id if device else None action.action = action_str state = episode_state_for_user_episode(request.user, episode) add_episode_actions(state, [action]) podcast = podcast_by_id(episode.podcast) return HttpResponseRedirect(get_episode_link_target(episode, podcast))
def get_episode_changes(user, podcast, device, since, until, aggregated, version): devices = dict( (dev.id, dev.uid) for dev in user.devices ) args = {} if podcast is not None: args['podcast_id'] = podcast.get_id() if device is not None: args['device_id'] = device.id actions = EpisodeAction.filter(user._id, since, until, **args) if version == 1: actions = imap(convert_position, actions) clean_data = partial(clean_episode_action_data, user=user, devices=devices) actions = map(clean_data, actions) actions = filter(None, actions) if aggregated: actions = dict( (a['episode'], a) for a in actions ).values() until_ = get_timestamp(until) return {'actions': actions, 'timestamp': until_}
def auto_flattr_episode(user, episode_id): """ Task to auto-flattr an episode In addition to the flattring itself, it also records the event """ success, msg = flattr_thing(user, episode_id, None, False, 'Episode') if not success: return False episode = episode_by_id(episode_id) state = episode_state_for_user_episode(user, episode) action = EpisodeAction() action.action = 'flattr' action.upload_timestamp = get_timestamp(datetime.utcnow()) add_episode_actions(state, [action]) return True
def flattr_episode(request, episode): """ Flattrs an episode, records an event and redirects to the episode """ user = request.user site = RequestSite(request) # Flattr via the tasks queue, but wait for the result task = flattr_thing.delay(user, episode._id, site.domain, request.is_secure(), 'Episode') success, msg = task.get() if success: action = EpisodeAction() action.action = 'flattr' action.upload_timestamp = get_timestamp(datetime.utcnow()) state = episode_state_for_user_episode(request.user, episode) add_episode_actions(state, [action]) messages.success(request, _("Flattr\'d")) else: messages.error(request, msg) podcast = podcast_by_id(episode.podcast) return HttpResponseRedirect(get_episode_link_target(episode, podcast))