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
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))
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)
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)
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))
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))
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)
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