Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
 def get_saved_username(self):
     user = User.get(self.saved_by)
     return user.username
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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')
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
 def get_saved_username(self):
     user = User.get(self.saved_by)
     return user.username