def patch(self, identifier, *args, **kwargs): """Patch general configuration.""" if not identifier: return self._bad_request('Config identifier not specified') if identifier != 'main': return self._not_found('Config not found') data = json_decode(self.request.body) accepted = {} ignored = {} for key, value in iter_nested_items(data): patch_field = self.patches.get(key) if patch_field and patch_field.patch(app, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) if ignored: log.warning('Config patch ignored {items!r}', {'items': ignored}) # Make sure to update the config file after everything is updated app.instance.save_config() # Push an update to any open Web UIs through the WebSocket msg = ws.Message('configUpdated', { 'section': identifier, 'config': DataGenerator.get_data(identifier) }) msg.push() self._ok(data=accepted)
def patch(self, identifier, *args, **kwargs): """Patch general configuration.""" if not identifier: return self._bad_request('Config identifier not specified') if identifier != 'main': return self._not_found('Config not found') data = json_decode(self.request.body) accepted = {} ignored = {} for key, value in iter_nested_items(data): patch_field = self.patches.get(key) if patch_field and patch_field.patch(app, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) if ignored: log.warning('Config patch ignored %r', ignored) # Make sure to update the config file after everything is updated app.instance.save_config() self._ok(data=accepted)
def _patch_episode(episode, data): """Patch episode and save the changes to DB.""" accepted = {} ignored = {} patches = { 'status': IntegerField(episode, 'status'), 'quality': IntegerField(episode, 'quality'), 'watched': BooleanField(episode, 'watched'), } for key, value in iter_nested_items(data): patch_field = patches.get(key) if patch_field and patch_field.patch(episode, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) # Save patched attributes in db. episode.save_to_db() if ignored: log.warning( 'Episode patch for {episode} ignored {items!r}', { 'episode': episode.identifier, 'items': ignored }, ) return accepted
def _patch_episode(episode, data): """Patch episode and save the changes to DB.""" accepted = {} ignored = {} patches = { 'status': IntegerField(episode, 'status'), 'quality': IntegerField(episode, 'quality'), 'watched': BooleanField(episode, 'watched'), } for key, value in iter_nested_items(data): patch_field = patches.get(key) if patch_field and patch_field.patch(episode, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) # Save patched attributes in db. episode.save_to_db() if ignored: log.warning( 'Episode patch for {episode} ignored {items!r}', {'episode': episode.identifier, 'items': ignored}, ) return accepted
def http_patch(self, series_slug, path_param=None): """Patch series.""" if not series_slug: return self._method_not_allowed('Patching multiple series is not allowed') identifier = SeriesIdentifier.from_slug(series_slug) if not identifier: return self._bad_request('Invalid series identifier') series = Series.find_by_identifier(identifier) if not series: return self._not_found('Series not found') data = json_decode(self.request.body) indexer_id = data.get('id', {}).get(identifier.indexer.slug) if indexer_id is not None and indexer_id != identifier.id: return self._bad_request('Conflicting series identifier') accepted = {} ignored = {} patches = { 'config.aliases': ListField(series, 'aliases'), 'config.defaultEpisodeStatus': StringField(series, 'default_ep_status_name'), 'config.dvdOrder': BooleanField(series, 'dvd_order'), 'config.seasonFolders': BooleanField(series, 'season_folders'), 'config.anime': BooleanField(series, 'anime'), 'config.scene': BooleanField(series, 'scene'), 'config.sports': BooleanField(series, 'sports'), 'config.paused': BooleanField(series, 'paused'), 'config.location': StringField(series, 'location'), 'config.airByDate': BooleanField(series, 'air_by_date'), 'config.subtitlesEnabled': BooleanField(series, 'subtitles'), 'config.release.requiredWords': ListField(series, 'release_required_words'), 'config.release.ignoredWords': ListField(series, 'release_ignore_words'), 'config.release.blacklist': ListField(series, 'blacklist'), 'config.release.whitelist': ListField(series, 'whitelist'), 'config.release.requiredWordsExclude': BooleanField(series, 'rls_require_exclude'), 'config.release.ignoredWordsExclude': BooleanField(series, 'rls_ignore_exclude'), 'language': StringField(series, 'lang'), 'config.qualities.allowed': ListField(series, 'qualities_allowed'), 'config.qualities.preferred': ListField(series, 'qualities_preferred'), 'config.qualities.combined': IntegerField(series, 'quality'), 'config.airdateOffset': IntegerField(series, 'airdate_offset'), } for key, value in iter_nested_items(data): patch_field = patches.get(key) if patch_field and patch_field.patch(series, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) # Save patched attributes in db. series.save_to_db() if ignored: log.warning('Series patch ignored {items!r}', {'items': ignored}) return self._ok(data=accepted)
def patch(self, series_slug, path_param=None): """Patch series.""" if not series_slug: return self._method_not_allowed('Patching multiple series is not allowed') identifier = SeriesIdentifier.from_slug(series_slug) if not identifier: return self._bad_request('Invalid series identifier') series = Series.find_by_identifier(identifier) if not series: return self._not_found('Series not found') data = json_decode(self.request.body) indexer_id = data.get('id', {}).get(identifier.indexer.slug) if indexer_id is not None and indexer_id != identifier.id: return self._bad_request('Conflicting series identifier') accepted = {} ignored = {} patches = { 'config.aliases': ListField(series, 'aliases'), 'config.defaultEpisodeStatus': StringField(series, 'default_ep_status_name'), 'config.dvdOrder': BooleanField(series, 'dvd_order'), 'config.seasonFolders': BooleanField(series, 'season_folders'), 'config.anime': BooleanField(series, 'anime'), 'config.scene': BooleanField(series, 'scene'), 'config.sports': BooleanField(series, 'sports'), 'config.paused': BooleanField(series, 'paused'), 'config.location': StringField(series, '_location'), 'config.airByDate': BooleanField(series, 'air_by_date'), 'config.subtitlesEnabled': BooleanField(series, 'subtitles'), 'config.release.requiredWords': ListField(series, 'release_required_words'), 'config.release.ignoredWords': ListField(series, 'release_ignore_words'), 'config.release.blacklist': ListField(series, 'blacklist'), 'config.release.whitelist': ListField(series, 'whitelist'), 'language': StringField(series, 'lang'), 'config.qualities.allowed': ListField(series, 'qualities_allowed'), 'config.qualities.preferred': ListField(series, 'qualities_preferred'), 'config.qualities.combined': IntegerField(series, 'quality'), } for key, value in iter_nested_items(data): patch_field = patches.get(key) if patch_field and patch_field.patch(series, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) # Save patched attributes in db. series.save_to_db() if ignored: log.warning('Series patch ignored {items!r}', {'items': ignored}) self._ok(data=accepted)
def patch(self, series_slug, path_param=None): """Patch series.""" if not series_slug: return self._method_not_allowed( 'Patching multiple series is not allowed') identifier = SeriesIdentifier.from_slug(series_slug) if not identifier: return self._bad_request('Invalid series identifier') series = Series.find_by_identifier(identifier) if not series: return self._not_found('Series not found') data = json_decode(self.request.body) indexer_id = data.get('id', {}).get(identifier.indexer.slug) if indexer_id is not None and indexer_id != identifier.id: return self._bad_request('Conflicting series identifier') accepted = {} ignored = {} patches = { 'config.dvdOrder': BooleanField(series, 'dvd_order'), 'config.flattenFolders': BooleanField(series, 'flatten_folders'), 'config.scene': BooleanField(series, 'scene'), 'config.paused': BooleanField(series, 'paused'), 'config.location': StringField(series, '_location'), 'config.airByDate': BooleanField(series, 'air_by_date'), 'config.subtitlesEnabled': BooleanField(series, 'subtitles') } for key, value in iter_nested_items(data): patch_field = patches.get(key) if patch_field and patch_field.patch(series, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) # Save patched attributes in db. series.save_to_db() if ignored: log.warning('Series patch ignored %r', ignored) self._ok(data=accepted)
def http_patch(self, identifier, *args, **kwargs): """Patch general configuration.""" if not identifier: return self._bad_request('Config identifier not specified') if identifier != 'main': return self._not_found('Config not found') data = json_decode(self.request.body) accepted = {} ignored = {} # Remove the metadata providers from the nested items. # It's ugly but I don't see a better solution for it right now. if data.get('metadata'): metadata_providers = data['metadata'].pop('metadataProviders') if metadata_providers: patch_metadata_providers = MetadataStructureField( app, 'metadata_provider_dict') if patch_metadata_providers and patch_metadata_providers.patch( app, metadata_providers): set_nested_value(accepted, 'metadata.metadataProviders', metadata_providers) else: set_nested_value(ignored, 'metadata.metadataProviders', metadata_providers) for key, value in iter_nested_items(data): patch_field = self.patches.get(key) if patch_field and patch_field.patch(app, value): set_nested_value(accepted, key, value) else: set_nested_value(ignored, key, value) if ignored: log.warning('Config patch ignored {items!r}', {'items': ignored}) # Make sure to update the config file after everything is updated app.instance.save_config() # Push an update to any open Web UIs through the WebSocket msg = ws.Message('configUpdated', { 'section': identifier, 'config': DataGenerator.get_data(identifier) }) msg.push() return self._ok(data=accepted)