Exemple #1
0
 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)
Exemple #3
0
 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 ''
Exemple #4
0
 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
Exemple #5
0
 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))
Exemple #6
0
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
Exemple #7
0
 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)
Exemple #8
0
 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)
Exemple #9
0
 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)
Exemple #10
0
 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)
Exemple #11
0
    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
Exemple #12
0
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(
Exemple #13
0
 def is_this_a_supercenter(self):
     sc_metadata = get_sc_metadata()
     ret = sc_metadata['scanningcenter'] in scribe_globals.SUPERCENTERS
     return ret
Exemple #14
0
 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()