def __init__(self, **kwargs): super(ImportFolderTask, self).__init__(**kwargs) self.source_path = kwargs['path'] self.library = kwargs['library'] self.book_obj = None self.image_stack = None self.scandata = None self.metadata = None self.DEFAULT_FIELDS_AND_VALUES = [ ('operator', get_sc_metadata()['operator']), ('scanningcenter', get_sc_metadata()['scanningcenter']), ('ppi', Scribe3Configuration().get_numeric_or_none('ppi')), ] self.do_not_rotate = True
def _process_book(self, metadata): generated_uuid = str(uuid4()) sc_metadata = get_sc_metadata() user = sc_metadata.get('operator') scanningcenter = sc_metadata.get('scanningcenter') scanner = sc_metadata.get('scanner') boxid = self.current_boxid Logger.info('Creating dummy book {}'.format(generated_uuid)) book = self.library.new_book(generated_uuid, operator=user, scanner=scanner, scanningcenter=scanningcenter, boxid=boxid) book.initialze_metaxml() slip_metadata = metadata slip_metadata['boxid'] = boxid slip_metadata['datetime'] = datetime.now() slip_metadata['reason'] = 'Duplicate' slip_metadata['comment'] = 'BOXED' # This is necessary to tell rejection tracker to put this event in a separate itemset slip_metadata['boxed'] = True slip_metadata['operator'] = book.operator book.set_slip_metadata(REJECTED_DO_NOT_WANT_SLIP, slip_metadata.copy()) # This is mostly a placeholder to demonstrate we can tell the user what to do on screen. self.banner_message = 'Put this book in box {}'.format( metadata.get('keep_dupe_status_code')) task_handler = self._reject_and_print_slip(book, slip_metadata) \ if self.print_slip \ else self._reject_without_printing_slip(book) task_handler.task.fbind('on_end', self._on_task_end) self.task_scheduler.schedule(task_handler.task)
def _on_config_change(self, event_type, payload): key, value = payload # though we read this value from metadata.xml, we use the shadow # value in configuration to get a change notification if event_type=='key_set' and key == 'operator': meta = get_sc_metadata() self.top_bar.username = meta.get('operator', None) or ''
def create_new_book(self): self.reset() generated_uuid = str(uuid4()) meta = get_sc_metadata() user = meta.get('operator') scanningcenter = meta.get('scanningcenter') self.book_obj = self.books_db.new_book(generated_uuid, operator=user, scanningcenter=scanningcenter) self.book_path = self.book_obj.path
def _init_top_bar(self, config): self.top_bar = top_bar = TopBar() meta = get_sc_metadata() top_bar.username = meta.get('operator', None) or '' top_bar.machine_id = meta.get('scanner', None) or '' top_bar.bind(on_option_select=self._on_top_bar_option_select) self.config.subscribe(self._on_config_change) # TODO: Better way to check if user is logged in if 's3' in self.config: self.add_widget(top_bar, len(self.children))
def _prepare_metadata(book, item, Logger, override=False): md = get_metadata(book['path']) send_to_station_file = os.path.join(book['path'], 'send_to_station') if os.path.exists(send_to_station_file): md['repub_state'] = '40' else: md['repub_state'] = '10' md['mediatype'] = 'texts' for k, v in md.items(): if ';' in v and k in scribe_globals.FLAT_MD_FIELDS: Logger.info('Detected a list-like flat field;' 'converting {} ({})to list.'.format(k, v)) md[k] = v.split(';') try: collections_list = md['collection'] except Exception: Logger.exception('upload_book: Could not find collection or ' 'collection set specification in book ' 'metadata.') collections_list = [] scancenter_md = get_sc_metadata() # we assume operator is the one provided by the machine # but we honor what has been set upstream if 'operator' in md: scancenter_md['operator'] = md['operator'] # same for language if 'language' in md: scancenter_md['language'] = md['language'] filled_md = _fill_metadata(scancenter_md, collections_list, item, md, Logger, override) # The old Scribe software uses author instead of creator, so we # do too, but we need to change this on upload if 'author' in filled_md: Logger.debug('upload_book: Converting author field to creator ' 'before upload to cluster') filled_md['creator'] = md['author'] del filled_md['author'] if 'identifier' not in filled_md: filled_md['identifier'] = item.identifier if config.is_true('set_noindex'): filled_md['noindex'] = 'true' encoded_md = _clean_metadata(filled_md, Logger) return encoded_md
def reject_book(self, data): self.logger.info('BMDS: Print rejection slip') metadata = {} metadata.update(data) sc_metadata = get_sc_metadata() metadata['scanner'] = sc_metadata['scanner'] metadata['datetime'] = datetime.datetime.now() metadata['timestamp'] = time.time() task = self._create_task(MakeAndPrintSlipTask, book=self.book_obj, type=REJECTED_CAN_NOT_SCAN_SLIP, slip_metadata=metadata, transition='do_reject') task.fbind('on_end', self._on_reject_book_end) self.task_scheduler.schedule(task)
def generate_and_print_slip(self, identifier): self.logger.info('BMDS: Generate slip') metadata = {} slip_type = SCANNED_SLIP if ('title' in self.book_obj.metadata and 'creator' in self.book_obj.metadata) \ else SCANNED_NO_MARC_SLIP sc_metadata = get_sc_metadata() metadata['scanner'] = sc_metadata['scanner'] metadata['identifier'] = identifier metadata['datetime'] = datetime.datetime.now() metadata['timestamp'] = time.time() task = self._create_task(MakeAndPrintSlipTask, type=slip_type, book=self.book_obj, slip_metadata=metadata) task.fbind('on_end', self._on_generate_and_print_slip_end) self.task_scheduler.schedule(task)
def generate_reserve_print_slip(self, identifier, next_action=None): self.logger.info('BMDS: Reserving identifier on IA and printing slip') metadata = {} slip_type = SCANNED_SLIP if ('title' in self.book_obj.metadata and 'creator' in self.book_obj.metadata) \ else SCANNED_NO_MARC_SLIP sc_metadata = get_sc_metadata() metadata['scanner'] = sc_metadata['scanner'] metadata['identifier'] = identifier metadata['datetime'] = datetime.datetime.now() metadata['timestamp'] = time.time() #assert self.book_obj.identifier == identifier, \ # 'The identifier in the text box and the one saved on disk differ.' task = self._create_task(MakeReserveAndPrintSlipTask, book=self.book_obj, type=slip_type, slip_metadata=metadata, transition=next_action) task.fbind('on_progress', task._on_make_reserve_print_slip_progress) task.fbind('on_end', self._on_generate_reserve_print_slip_end) self.task_scheduler.schedule(task)
def cannot_scan_book(self, catalog, selector, response): self.logger.info('BMDS: Print DO NOT WANT rejection slip') metadata = {} sc_metadata = get_sc_metadata() metadata['scanner'] = sc_metadata['scanner'] metadata['datetime'] = datetime.datetime.now() metadata['reason'] = 'Duplicate' metadata['comment'] = response.get('keep_dupe_message') metadata['keep_dupe_status'] = response.get('keep_dupe_status') metadata['keep_dupe_status_code'] = response.get( 'keep_dupe_status_code') metadata['dwwi_response'] = response metadata['catalog'] = catalog metadata['selector'] = selector metadata['timestamp'] = time.time() task = self._create_task(MakeAndPrintSlipTask, book=self.book_obj, type=REJECTED_DO_NOT_WANT_SLIP, slip_metadata=metadata, transition='do_move_to_trash') task.fbind('on_end', self._on_reject_book_end) self.task_scheduler.schedule(task)
def _ensure_valid_metadata(self, metadata): for key in metadata: if key in MD_KEYS_WITH_SINGLE_VALUE \ and isinstance(metadata[key], list) \ and len(metadata[key]) > 1: first_value = metadata[key][0] self.logger.warn('BookMetadataScreenBackend: Found more than' 'one value of "{0}" in book metadata. ' 'Adjusting to use first value of {1}, ' 'so md[{0}] => {2}'.format( key, metadata[key], first_value)) metadata[key] = first_value config = self._config ppi = metadata.get('ppi', None) if isinstance(ppi, list): ppi = ppi[0] if ppi is None or int(float(ppi)) < 1: ppi = config.get('camera_ppi', None) if ppi is None or int(float(ppi)) < 1: ppi = DEFAULT_PPI metadata['ppi'] = int(float(ppi)) else: metadata['ppi'] = int(float(ppi)) sc_metadata = get_sc_metadata() operator = self.book_obj.operator \ if self.book_obj.operator is not None else sc_metadata.get('operator') scanningcenter = self.book_obj.scanningcenter \ if self.book_obj.scanningcenter is not None else sc_metadata.get('scanningcenter') metadata.setdefault('operator', operator) metadata.setdefault('scanningcenter', scanningcenter) if 'language' not in metadata: if config.is_true('prefill_language'): language = sc_metadata.get('language', None) if language: metadata['language'] = language
import json from queue import Queue import requests from ia_scribe import scribe_globals from ia_scribe.book.metadata import get_sc_metadata Logger = logging.getLogger('Oxcart') Logger.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter(scribe_globals.LOGGING_FORMAT) handler.setFormatter(formatter) Logger.addHandler(handler) scribe_metadata = get_sc_metadata() try: adapter = scribe_metadata['scanner'] except: adapter = None def put_metric(metric, value, payload=None): events_queue.put((adapter, metric, value, payload)) def _push_metric(adapter, metric, value, payload=None): API_URL = 'https://iabooks.archive.org/ingestion/v0.1/{adapter}/?metric={metric}&value={value}' try: if not adapter: Logger.debug(
def is_this_a_supercenter(self): sc_metadata = get_sc_metadata() ret = sc_metadata['scanningcenter'] in scribe_globals.SUPERCENTERS return ret
def __init__(self, **kwargs): self._config = get_sc_metadata() self.current_user = self._config[ 'operator'] if self._config and 'operator' in self._config else 'none' super(UserSwitchScreenBackend, self).__init__(**kwargs) self.recent_users = self._load_users_from_disk()