示例#1
0
文件: stock.py 项目: rokj/sellout
def product_to_dict(user, company, product, android=False):
    # returns all relevant product's data
    ret = {}

    ret['id'] = product.id

    # purchase price
    purchase_price = product.get_purchase_price()
    if not purchase_price:
        ret['purchase_price'] = ''
    else:
        ret['purchase_price'] = format_number(user, company, purchase_price, True)

    # sale price
    price = product.get_price()
    if not price:
        ret['price'] = ''
    else:
        ret['price'] = format_number(user, company, price, True)

    # all discounts in a list
    discounts = []
    all_discounts = product.get_discounts()
    for d in all_discounts:
        # discounts.append(d.id)
        discounts.append(discount_to_dict(user, company, d, android))
    ret['discounts'] = discounts
    if product.image:  # check if product's image exists:
        if android:
            with open(product.image.path, "rb") as image_file:
                encoded_string = base64.b64encode(image_file.read())
            ret['image'] = encoded_string
        else:
            ret['image'] = get_thumbnail(product.image, image_dimensions('product')[2]).url

    # tax: it's a not-null foreign key
    ret['tax_id'] = product.tax.id
    ret['tax'] = format_number(user, company, product.tax.amount)
    # stock: it cannot be 'undefined'
    ret['stock'] = format_number(user, company, product.stock)

    # category?
    if product.category:
        ret['category'] = product.category.name
        ret['category_id'] = product.category.id
    else:
        ret['category'] = None
        ret['category_id'] = None

    ret['code'] = product.code
    ret['shortcut'] = product.shortcut
    ret['name'] = product.name
    ret['description'] = product.description
    ret['private_notes'] = product.private_notes
    ret['unit_type'] = product.unit_type
    ret['unit_type_display'] = product.get_unit_type_display()
    ret['stock'] = format_number(user, company, product.stock)
    ret['color'] = product.color
    ret['favorite'] = product.favorite
    return ret
示例#2
0
文件: discount.py 项目: rokj/sellout
def mobile_add_discount(request, company_id):
    # edit an existing contact
    try:
        c = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    # check permissions: needs to be at least manager
    if not has_permission(request.user, c, 'discount', 'edit'):
        return JsonError(_("add discounts"))

    data = JsonParse(request.POST['data'])

    valid = validate_discount(data, request.user, c, android=True)

    if not valid.get('status'):
        return JsonError(valid['message'])

    form = valid['form']
    d = Discount(
                description=form.cleaned_data.get('description'),
                code=form.cleaned_data.get('code'),
                type=form.cleaned_data.get('type'),
                amount=form.cleaned_data.get('amount'),
                start_date=form.cleaned_data.get('start_date'),
                end_date=form.cleaned_data.get('end_date'),
                enabled=form.cleaned_data.get('enabled'),

                created_by=request.user,
                company=c
            )
    d.save()

    return JsonOk(extra=discount_to_dict(request.user, c, d, android=True))
示例#3
0
文件: discount.py 项目: rokj/sellout
def mobile_list_discounts(request, company_id):
    try:
        c = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    # check permissions: needs to be guest
    if not has_permission(request.user, c, 'discount', 'view'):
        return JsonError(_("view discounts"))

    discounts = Discount.objects.filter(company__id=c.id)

    results_display = False

    data = JsonParse(request.POST['data'])

    # show the filter form
    if request.method == 'POST':

        if data.get('search'):
            discounts = discounts.filter(description__icontains=data['search']) | \
                        discounts.filter(code__icontains=data['search'])

        # start_date
        if data.get('start_date'):
            # parse date first
            start_date = data.get('start_date')
            start = dtm.date(year=start_date[0], month=start_date[1],
                             day=start_date[2])

            discounts = discounts.filter(start_date__gte=start)

        # end_date
        if data.get('end_date'):
            end_date = data.get('end_date')
            end = dtm.date(year=end_date[0], month=end_date[1],
                             day=end_date[2])

            discounts = discounts.filter(end_date__lse=end)

        # active
        if data.get('active') is not None:
            discounts = discounts.filter(active=data['active'])

        results_display = True  # search results are being displayed


    r = []
    for d in discounts:
        r.append(discount_to_dict(request.user, c, d, android=True))

    return JsonOk(extra=r)
示例#4
0
文件: discount.py 项目: rokj/sellout
def mobile_get_discounts(request, company_id):
    try:
        c = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    if not has_permission(request.user, c, 'discount', 'list'):
        return JsonError(_("You have no permission to view taxes"))

    discounts = Discount.objects.filter(company=c)

    r = []
    for d in discounts:
        r.append(discount_to_dict(request.user, c, d, android=True))

    return JsonOk(extra=r)
示例#5
0
文件: discount.py 项目: rokj/sellout
def mobile_edit_discount(request, company_id):
    # edit an existing contact
    try:
        c = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    # check permissions: needs to be at least manager
    if not has_permission(request.user, c, 'discount', 'edit'):
        return JsonError(_("edit discounts"))

    data = JsonParse(request.POST['data'])

    try:
        d = Discount.objects.get(id=data['id'])
    except Discount.DoesNotExist:
        return JsonError(_("Discount does not exist"))

    # check if contact actually belongs to the given company
    if d.company != c:
        return JsonError(_("failed"))

    if request.method == 'POST':

        data = JsonParse(request.POST['data'])
        valid = validate_discount(data, request.user, c, android=True, discount=d)

        if not valid.get('status'):
            return JsonError(valid['message'])

        form = valid['form']
        # d = form.save(False)
        d.description = form.cleaned_data.get('description')
        d.code = form.cleaned_data.get('code')
        d.type = form.cleaned_data.get('type')
        d.amount = form.cleaned_data.get('amount')
        d.start_date = form.cleaned_data.get('start_date')
        d.end_date = form.cleaned_data.get('end_date')
        d.enabled = form.cleaned_data.get('enabled')
        d.save()
        # d.save()

        return JsonOk(extra=discount_to_dict(request.user, c, d, android=True))
示例#6
0
文件: discount.py 项目: rokj/sellout
def mobile_delete_discount(request, company):
    try:
        c = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    # check permissions: needs to be at least manager

    if not has_permission(request.user, c, 'discount', 'edit'):
        return JsonError(_("You have no permission to view taxes"))

    data = JsonParse(request.POST['data'])

    try:
        d = Discount.objects.get(id=data['id'])
    except Discount.DoesNotExist:
        return JsonError(_("Discount does not exist"))

    d.delete()

    return JsonOk(extra=discount_to_dict(request.user, c, d, android=True))
示例#7
0
文件: views.py 项目: rokj/sellout
def mobile_sync_db(request, company_id):

    try:
        company = Company.objects.get(id=company_id)
    except Company.DoesNotExist:
        return JsonError(_("Company does not exist"))

    data = JsonParse(request.POST['data'])

    seq = data['database_version']
    device_id = data['device_id']

    sync_objects = Sync.objects.only('seq')\
        .filter(company=company).order_by('-seq')

    last_key = 0

    if len(sync_objects) > 0:
        last_key = sync_objects[0].seq

    ret = {'version': last_key}

    if seq == 0 or last_key - 5000 > seq or seq > last_key:

        # if first sync or sync outdated, why not load whole DB

        ret['updated'] = False
        ret['drop'] = True

        # get taxes
        ret['taxes'] = get_all_taxes(request.user, company)

        # get contacts
        contacts = Contact.objects.filter(company=company)
        cs = []
        for contact in contacts:
            cs.append(contact_to_dict(request.user, company, contact))

        ret['contacts'] = cs

        # get categories
        categories = Category.objects.filter(company=company)
        ct = []

        for category in categories:
            ct.append(category_to_dict(category, android=True))

        ret['categories'] = ct

        # get discounts
        discounts = Discount.objects.filter(company=company)
        ds = []

        for discount in discounts:
            ds.append(discount_to_dict(request.user, company, discount, android=True))

        ret['discounts'] = ds

        # get products
        products = Product.objects.filter(company=company)
        pr = []
        for product in products:
            pr.append(product_to_dict(request.user, company, product, android=True))

        ret['products'] = pr

        try:
            register = Register.objects.get(company=company, device_id=device_id)
            ret['register'] = register_to_dict(request.user, company, register)
        except Register.DoesNotExist:
            ret['register'] = None

        ret['company'] = company_to_dict(request.user, company, android=True, with_config=True)

    elif seq < last_key:

        ret['updated'] = False
        ret['drop'] = False
        seq_list = Sync.objects.filter(company=company, seq__lte=last_key).order_by('seq')

        items = []

        for seq_item in seq_list:
            item_ret = {'action': seq_item.action,
                        'model':  seq_item.model,
                        'object_id': seq_item.object_id}

            if seq_item.action == 'save':
                if seq_item.model == 'Category':
                    c = Category.objects.get(id=seq_item.object_id)
                    item_ret['item'] = category_to_dict(c, android=True)

                elif seq_item.model == 'Product':
                    p = Product.objects.get(id=seq_item.object_id)
                    item_ret['item'] = product_to_dict(request.user, company, p, android=True)

                elif seq_item.model == 'Tax':
                    t = Tax.objects.get(id=seq_item.object_id)
                    item_ret['item'] = tax_to_dict(request.user, company, t)

                elif seq_item.model == 'Discount':
                    d = Discount.objects.get(id=seq_item.object_id)
                    item_ret['item'] = discount_to_dict(request.user, company, d, android=True)

                elif seq_item.model == 'Contact':
                    con = Contact.objects.get(id=seq_item.object_id)
                    item_ret['item'] = contact_to_dict(request.user, company, con)

                elif seq_item.model == 'Register':
                    r = Register.objects.get(id=seq_item.object_id)
                    item_ret['item'] = register_to_dict(request.user, company, r)

                elif seq_item.model == 'Company':
                    item_ret['item'] = company_to_dict(request.user, company, android=True, with_config=True)

            items.append(item_ret)

        ret['items'] = items

    else:
        ret['updated'] = True

    return JsonOk(extra=ret, safe=False)
示例#8
0
文件: product.py 项目: rokj/sellout
def product_to_dict(user, company, product, android=False):
    # returns all relevant product's data
    ret = {}

    ret['id'] = product.id

    # purchase price
    purchase_price = product.get_purchase_price()
    if not purchase_price:
        ret['purchase_price'] = ''
    else:
        ret['purchase_price'] = format_number(user, company, purchase_price, True)

    # sale price
    price = product.get_price()

    if price is None:
        ret['price'] = ''
    else:
        ret['price'] = format_number(user, company, price, True)

    # all discounts in a list
    discounts = []
    all_discounts = product.get_discounts()
    for d in all_discounts:
        # discounts.append(d.id)
        discounts.append(discount_to_dict(user, company, d, android))
    ret['discounts'] = discounts
    if product.image:  # check if product's image exists:
        if android:
            # uf, if images are big, then what, at least we should thumnbnail-it
            with open(product.image.path, "rb") as image_file:
                encoded_string = base64.b64encode(image_file.read())
            ret['image'] = encoded_string
        else:
            ret['image'] = get_thumbnail(product.image, image_dimensions('product')[2]).url

    # tax: it's a not-null foreign key
    ret['tax_id'] = product.tax.id
    ret['tax'] = format_number(user, company, product.tax.amount)

    # category?
    if product.category:
        ret['category'] = product.category.name
        ret['category_id'] = product.category.id
    else:
        ret['category'] = g.NO_CATEGORY_NAME
        ret['category_id'] = -1

    ret['code'] = product.code
    ret['shortcut'] = product.shortcut
    ret['name'] = product.name
    ret['description'] = product.description
    ret['private_notes'] = product.private_notes
    ret['unit_type'] = product.unit_type
    ret['unit_type_display'] = product.get_unit_type_display()
    # stock: it cannot be 'undefined'
    # ret['stock'] = format_number(user, company, product.stock)
    ret['color'] = product.color
    ret['favorite'] = product.favorite

    if hasattr(product, 'stock_products'):
        stock_products = []

        for sp in product.stock_products:
            stock_product = {}
            stock_product['stock_name'] = sp.stock.name
            stock_product['deduction'] = sp.deduction
            stock_product['left_stock'] = sp.stock.left_stock
            stock_product['stock_unit_type'] = sp.stock.unit_type
            stock_products.append(stock_product)

        ret['stock_products'] = stock_products

    return ret