def search(request, user_id): """ Search Item Popup """ user = User.get(user_id) context = {"userdoc": user, "user": request.user} return render_to_response('circulation/search.html', context)
def loan_ticket(request, item_id): item = WFItem.get(item_id) user = User.get(item.loan.user_id) context = { "user": user, "item": item, "end": item.loan.end.strftime("%d/%m/%Y"), } return render_to_response('circulation/loan_ticket.html', context)
def return_loan_ticket(request, user_id, item_id): item = WFItem.get(item_id) now = datetime.datetime.now() user = User.get(user_id) context = { "user": user, "item": item, "end": now.strftime("%d/%m/%Y"), } return render_to_response('circulation/return_loan_ticket.html', context)
def get_saved_username(self): user = User.get(self.saved_by) return user.username
def search_user(request): docs = [] query = request.POST['filter'] if not query: return_dict = { "sEcho": 1, "iTotalRecords": 0, "iTotalDisplayRecords": 0, "aaData": [] } return jsonfy(**return_dict) if query.isdigit(): query = "document_number:%s" % query else: query = "%s~.1" % sanitize_lucene(query) for doc in search_lucene('searchauth/user', database="couchauthsearch", q=query): docs.append(doc) start = int(request.POST['iDisplayStart']) length = int(request.POST['iDisplayLength']) secho = int(request.POST['sEcho']) + 1 #sort_col = int(request.POST['iSortCol_0']) #sort_dir = request.POST['sSortDir_0'] count = len(docs) db = User.get_db() keys = [doc['id'] for doc in docs[start:start + length]] columns = [] for doc in db.view('_all_docs', keys=keys, include_docs=True): doc = User.wrap(doc['doc']) username = '******' % \ (doc._id, doc.username) if doc._attachments and 'photo' in doc._attachments: img_path = "/couchflow/get_attach/couchauth/%s/photo" % doc._id img = '<img style="width:40px" src="%s"/>' % img_path else: img = '<div class="nophoto">?</div>' first_name = doc.first_name last_name = doc.last_name dni = doc.document_number row = [doc._id, img, username, first_name, last_name, dni] columns.append(row) return_dict = { "sEcho": secho, "iTotalRecords": count, "iTotalDisplayRecords": count, "aaData": columns } return jsonfy(**return_dict)
def loan(request, what, user_id, item_id, loan_type=None): """ Make a loan/reserve """ # If date it's a reserve else it's a loan date = request.GET.get("date", None) user = User.get(user_id) if not user: return jsonfy(error='user not found') # TODO: get days from config days = 7 if loan_type == 'room': days = 1 if date: date = format_date(date, '%d/%m/%Y') start = get_business_day(date) start = get_business_day(datetime.date.today()) end = get_business_day(start + datetime.timedelta(days=days)) actual_days = (end - start).days requested_item = WFItem.get(item_id) # TODO: re do everything to use one item #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() items = [requested_item] loanable_items = [] for item in items: if not item.inventory_nbr: print "inventory_nbr is None" continue # it's a reserve and item have a reserve # and it only must support 1 reserve per item if date and item.reserves: print 'No se puede reservar un item reservado' continue # it's a loan and item have a loan if not date and item.loan.start: print 'No se puede prestar un item prestado' continue # if nave no reserve and no loan it can # be given to anyone, so empty the list # and make it the only option if not item.reserves and not item.loan.start: loanable_items = [item] print "ideal, se puede prestar o reservar" break # if it's a loan, and item has not a loan and if (date and not item.reserves): loanable_items.append(item) # if it's a loan, and item has not a loan and # no fit in start and reserve if (not date and not item.loan.start): item_days = (item.reserves[0].start, item.reserves[0].end) new_start, new_end = get_hole([item_days], start, days) if new_start != start and new_end != end: loanable_items = [item] break # TODO: return json error # can't loan a item that is loaned if not loanable_items: all_dates = [] for item in items: if item.loan.start and not item.reserves: all_dates.append(item.loan.end) elif item.reserves: all_dates.append(item.reserves[0].end) if not all_dates: return jsonfy(item=item_id, error="no se encuentra disponible") max_date = get_business_day(min(all_dates) + datetime.timedelta(1)) max_date = max_date.strftime("%d/%m/%Y") error = 'No se pudo encontrar disponibilidad, '\ 'se calcula disponibilidad para el "%s"' % max_date return jsonfy(item=item_id, error=error) # if its a loan and there is only one # nothing else needed, dates and item is set if not date and len(loanable_items): item = loanable_items[0] # reserve an just one item elif date and len(loanable_items) == 1: item = loanable_items[0] # if there's a loan get the closest date if item.loan.start: item_days = (item.loan.start, item.loan.end) start, end = get_hole([item_days], start, days) # else you can make the reserve when asked else: print item.loan print item.reserves print 'IDEAL!' # there are more than one posible reserve, get the best else: loanable_dates = [] for loanable in loanable_items: item_days = (loanable.loan.start, loanable.loan.end) new_start, new_end = get_hole([item_days], start, days) loanable_dates.append((new_start, new_end, loanable)) loanable_dates.sort(key=lambda i: i[0]) start, end, item = loanable_dates[0] if not date: loan = Loan(start=start, end=end, user_id=user_id, type=loan_type) item.loan = loan CirculationLog(type='loan', date=start, length=actual_days, item_type=item.item_type, loan_type=loan_type, item_id=item._id, user_id=user_id).save() else: reserve = Reserve(start=start, end=end, user_id=user_id) item.reserves.append(reserve) item.save() return jsonfy(item=item._id, status='loaned')
def user(request, user_id): """ User Profile Page """ #user = request.user user_db = User.get_db() if user_id == 'me': user = request.user groups = user.group_names else: user = User.get(user_id) groups = [ x['doc']['name'] for x in user_db.view("couchauth/groups_by_username", key=user.username, include_docs=True) ] if user._attachments and 'photo' in user._attachments: photo = "/couchflow/get_attach/couchauth/%s/photo" % user._id else: photo = None editlink = "/webconf/couchauth/edit_user/%s/" % user.username context = { "user": request.user, "userdoc": user, "photo": photo, "groups": groups, "editlink": editlink, } if 'biblio' in request.user.group_names: context['is_biblio'] = True if user_id == 'me': penalties = list(user_db.view("couchauth/penalties")) context['show_penalty_alert'] = True context['penalty_alert'] = penalties if context.get('is_biblio', False) or request.user.is_superuser or \ user_id == 'me': circ_db = CirculationLog.get_db() startkey = [user._id] endkey = [user._id, {}] results = circ_db.view("circulation/logs", include_docs=True)[startkey:endkey] logs = {} for row in results: row_id = tuple(row['key'][1:]) logs.setdefault(row_id, {}) logs[row_id][row['doc']['doc_type']] = row['doc'] logs_list = [x[1] for x in sorted(logs.items(), key=lambda x: x[0])] context['logs'] = logs_list return render_to_response('circulation/user.html', context)