def user_loans(request, user_id): """ Returns the user loans as a json object """ # use custom wrapper here, becouse default don't let you access to view keys loans = WFItem.view('circulation/loans', include_docs=True, wrapper=WFItem.wrap, startkey=[user_id], endkey=[user_id, {}, {}]) reserves = WFItem.view('circulation/reserves', include_docs=True, wrapper=WFItem.wrap, startkey=[user_id], endkey=[user_id, {}, {}]) start = int(request.POST['iDisplayStart']) length = int(request.POST['iDisplayLength']) secho = int(request.POST['sEcho']) + 1 count = len(loans) + len(reserves) columns = [] for loan in loans: user_id, start, end = loan['_doc']['key'] start, end = format_date(start), format_date(end) start = start.strftime("%d/%m/%Y") end = end.strftime("%d/%m/%Y") columns.append([ loan._id, loan.inventory_nbr, "prestamo", loan.title, start, end, "" ]) for reserve in reserves: user_id, start, end = reserve['_doc']['key'] start, end = format_date(start), format_date(end) start = start.strftime("%d/%m/%Y") end = end.strftime("%d/%m/%Y") columns.append([ reserve._id, reserve.inventory_nbr, "reserva", reserve.title, start, end, "" ]) return_dict = { "sEcho": secho, "iTotalRecords": count, "iTotalDisplayRecords": count, "aaData": columns } return jsonfy(**return_dict)
def catalog_items(status, user): if status.endswith('libro'): wfname = 'procesos_tecnicos' elif status.endswith('revista'): wfname = 'hemeroteca' else: raise Exception, 'revista or libro' filter_items = WFItem.view('couchflow/filter_items') items_query = filter_items[status] selected_items = [item['id'] for item in items_query] if not selected_items: return workflows = WorkFlow.view("couchflow/orig_workflows", include_docs=True) workflows = workflows[wfname] workflow = workflows.one() clone = clone_this_wf(workflow._id, user._id) clone.set_enabled() try: clone.save() except Exception, error: print error
def handle(self, *args, **options): # filename = args['filename'] subfields = True filename = options["from"] items = [] db = WFItem.get_db() orig_item = WFItem.view("couchflow/item_names", include_docs=True)["libro"].first() org_json_item = orig_item.to_json() counter = 0 i = 0 for record in iter_iso_records(filename, subfields): i += 1 json_item = clone_json(org_json_item) json_item["fields_properties"]["99989"]["list"][0]["exec_value"] = ["catalogado"] copies = [] has_isbn = False for key, fields in record.iteritems(): key = "%03d" % int(key) if key == "020": has_isbn = True if key == "852": copies = fields continue add_field(key, fields, json_item) if not has_isbn and options["fake_isbn"]: json_item["fields_properties"]["1020"]["list"][0]["subfields"]["a"]["exec_value"] = [uuid.uuid4().hex] items.append(json_item) # add existences for field in copies: json_item = clone_json(json_item) add_field("852", [field], json_item) add_field("1111", [{"_": "existencia"}], json_item) items.append(json_item) if len(items) >= options["per_iter"]: if not options["dry_run"]: db.bulk_save(items, use_uuids=False) counter += len(items) items = [] print "%s %s items (total %s)" % ( "Parsed" if options["dry_run"] else "Inserted", options["per_iter"], counter, ) if items and not options["dry_run"]: db.bulk_save(items, use_uuids=False) counter += len(items) print print "Done, %s items" % counter print ""
def admin(request): user = request.user context = {"user": user} wf_items = list(WFItem.view("couchflow/items", include_docs=True)) save_config(request, wf_items) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '') if request.method == "POST": post_default_type = request.POST.get('default_type', '') if post_default_type != default_type: settings.values['default_type'] = post_default_type.lower() settings.save() default_type = post_default_type items = [] for item in wf_items: fields = {} for _id, ifields in item.fields_properties.iteritems(): # Just marc fields if int(ifields['id']) > 1000: continue field_name = ifields['id'] if ifields['list'][0].subfields: default_field = { 'id': ifields['id'], 'name': ifields['field_name'], 'subfields': {} } subfields = fields.setdefault(field_name, default_field)["subfields"] for subfield in ifields['list'][0].subfields.values(): sfield_name = '%s_%s' % (ifields['id'], subfield.field_name) sfield = subfields.setdefault(sfield_name, {}) sfield['name'] = subfield.field_name fields[field_name]['subfields'] = sorted(subfields.items()) else: fields.setdefault(field_name, {})['id'] = field_name fields[field_name]['name'] = ifields.field_name items.append((item.name, item._id, sorted(fields.items()))) context['items'] = items context['default_type'] = default_type.lower() return render_to_response('search/admin.html', context)
def admin(request): user = request.user context = {"user": user} wf_items = list(WFItem.view("couchflow/items", include_docs=True)) save_config(request, wf_items) settings = Config.get_or_create("search_settings") default_type = settings.values.get('default_type', '') if request.method == "POST": post_default_type = request.POST.get('default_type', '') if post_default_type != default_type: settings.values['default_type'] = post_default_type.lower() settings.save() default_type = post_default_type items = [] for item in wf_items: fields = {} for _id, ifields in item.fields_properties.iteritems(): # Just marc fields if int(ifields['id']) > 1000: continue field_name = ifields['id'] if ifields['list'][0].subfields: default_field = {'id': ifields['id'], 'name': ifields['field_name'], 'subfields': {}} subfields = fields.setdefault(field_name, default_field)["subfields"] for subfield in ifields['list'][0].subfields.values(): sfield_name = '%s_%s' % (ifields['id'], subfield.field_name) sfield = subfields.setdefault(sfield_name, {}) sfield['name'] = subfield.field_name fields[field_name]['subfields'] = sorted(subfields.items()) else: fields.setdefault(field_name ,{})['id'] = field_name fields[field_name]['name'] = ifields.field_name items.append((item.name, item._id, sorted(fields.items()))) context['items'] = items context['default_type'] = default_type.lower() return render_to_response('search/admin.html', context)
def filter_wflows(user): for i in ('libro', 'revista'): catalog_items('a catalogar %s' % i, user) # TODO return db = FilterWFItems.get_db() wf_tasks = db.view("couchflow/wf_by_first_task_type", include_docs=True)["FilterWFItems":"FilterWFItems"] tasks = {} wflows = [] wf_tasks = wf_tasks.all() for value in wf_tasks: if value["doc"]["doc_type"] == "WorkFlow": wflows.append(WorkFlow.wrap(value["doc"])) elif value["doc"]["doc_type"] == "FilterWFItems": task = FilterWFItems.wrap(value["doc"]) tasks[task._id] = task for wf in wflows: task = tasks.get(wf.first_task_id, None) if not task: raise Exception, "Check" field = task.item_fields.get("99989", None) print "Filter by", field if not field: print "cant get status field" continue filter_items = WFItem.view('couchflow/filter_items') items_query = filter_items[field] selected_items = [item['id'] for item in items_query] if not selected_items: continue clone = clone_this_wf(wf._id, user._id) clone.set_enabled() try: clone.save() except Exception, error: print error tasks = Task.view("couchflow/activetask", include_docs=True) tasks = tasks[clone._id] task = tasks.one() task.wfitems_ids = selected_items task.save() task.active_conector()
def return_loan(request, nro_inv=None): """ Returns a loan by inventory number """ context = {"user": request.user} if not request.method == "POST": return render_to_response('circulation/return_loan.html', context) nro_inv = request.POST.get("inventory_nbr", None) if not nro_inv: context["status"] = "Debe ingresar el numero de inventario" return render_to_response('circulation/return_loan.html', context) items = WFItem.view('couchflow/by_inventory_nbr', include_docs=True, startkey=nro_inv, endkey=nro_inv) if len(items) > 1: print "should only be one item" item = items.first() if not item: context["status"] = "Ese item no existe" return render_to_response('circulation/return_loan.html', context) if not item.loan.start: context["status"] = "Ese item no se encuentra prestado" return render_to_response('circulation/return_loan.html', context) # remove loan old_loan_type = item.loan.type old_loan_user = item.loan.user_id item.loan = Loan() item.save() CirculationLog(type='return', item_id=item._id, item_type=item.item_type, user_id=old_loan_user, loan_type=old_loan_type).save() context["status"] = 'El item "%s" ha sido devuelto exitosamente.' % nro_inv return render_to_response('circulation/return_loan.html', context)
def get_item_inventory(request, item_id): """ Returns the list of inventory items """ # TODO: Should this functiong get urn instead item_id? try: item = WFItem.get(item_id) except ResourceNotFound: return jsonfy(error='ResourceNotFound') urn = item.urn if not urn: return jsonfy(error='InvalidItem') items = WFItem.view('couchflow/by_urn', include_docs=True, startkey=urn, endkey=urn).all() return jsonfy(items=[item.inventory_nbr for item in items])
def get_reserves_item(self, item_id): start = datetime.date.today() end = start + datetime.timedelta(days=7) requested_item = WFItem.get(item_id) urn = requested_item.urn if not urn: return jsonfy(error='invalid urn') items = WFItem.view('couchflow/by_urn', include_docs=True, startkey=urn, endkey=urn).all() loanable = False loanable_item = None for item in items: if not item.inventory_nbr: print "inventory_nbr is None" continue if not item.loan.start: loanable = True for reserve in item.reserves: if end >= reserve.start: print "item unlonable:" print "start:%s end: %s" % (start, end) print reserve print loanable = False break if loanable: loanable_item = item break
def handle(self, *args, **options): #filename = args['filename'] subfields = True filename = options['from'] items = [] db = WFItem.get_db() orig_item = WFItem.view('couchflow/item_names', include_docs=True)['libro'].first() org_json_item = orig_item.to_json() counter = 0 i = 0 for record in iter_iso_records(filename, subfields): i += 1 json_item = clone_json(org_json_item) json_item["fields_properties"]['99989']['list'][0][ 'exec_value'] = ['catalogado'] copies = [] has_isbn = False for key, fields in record.iteritems(): key = "%03d" % int(key) if key == '020': has_isbn = True if key == "852": copies = fields continue add_field(key, fields, json_item) if not has_isbn and options['fake_isbn']: json_item["fields_properties"]['1020']['list'][0] \ ['subfields']['a']['exec_value'] = [uuid.uuid4().hex] items.append(json_item) # add existences for field in copies: json_item = clone_json(json_item) add_field("852", [field], json_item) add_field("1111", [{"_": "existencia"}], json_item) items.append(json_item) if len(items) >= options['per_iter']: if not options['dry_run']: db.bulk_save(items, use_uuids=False) counter += len(items) items = [] print '%s %s items (total %s)' % ( 'Parsed' if options['dry_run'] else 'Inserted', options['per_iter'], counter) if items and not options['dry_run']: db.bulk_save(items, use_uuids=False) counter += len(items) print print "Done, %s items" % counter print ""