Example #1
0
    def create(self, request):
        ready_data_true =  {'success': True }
        ready_data_false = {'success': False}

        if not request.user.is_authenticated():
            ready_data_false["error"] = "Authorization is failed"
            return ready_data_false

        currentProfile = Profile.getProfile( request.user)

        try:
            ext_posted_data = simplejson.loads(request.POST.get('items'))
            attrs = self.flatten_dict(ext_posted_data)

            req = check(request, id=None, attrs=attrs)

            if req == True:
                reason=[]
                item = self.model.objects.create(\
                    name = replace(attrs['name']), \
                    category_id = attrs['category_id'], \
                    unit_id = attrs['unit_id'], \
                    upc = replace(attrs['upc']), \
                    upc_2 = replace(attrs['upc_2']), \
                    upc_3 = replace(attrs['upc_3']), \
                    upc_case = replace(attrs['upc_case']), \
                    notes=replace(attrs['notes']), \
                    image_url=attrs['image_url'], \
                    qt_in_stock=0, \
                    qt_to_stock=0, \
                    min_qt_in_stock=2, \
                    enabled=True, \
                    sales_price=0, \
                    loc_stock = u'',\
                    loc_ret_dept = u'',\
                    loc_ret_col = u'',\
                    loc_ret_row = u'',\
                    inventory_no_count = False,\
                    so_ignore_no_sales = False,\
                    so_do_not_order = False,\
                    so_always_order = 0,\
                    user=currentProfile.parent_user)
                ready_data_true['items'] = item.list(item.id)
                return ready_data_true
            else:
                ready_data_false['errors'] = req
                return ready_data_false
        except Exception, err:
            logger.error(err)
            logger.error('REQUEST: %s' % str(request) )
            ready_data_false['errors'] = err.message
            ready_data_false['name'] = replace(attrs['name'])
            return ready_data_false
Example #2
0
    def read(self, request, id=None):
        ready_data_true =  {'success': True }
        ready_data_false = {'success': False}


        if not request.user.is_authenticated():
            ready_data_false["error"] = "Authorization is failed"
            return ready_data_false
            
        try:
            currentProfile = Profile.getProfile( request.user)

            ready_data_false['id'] = id
            action = request.GET.get('action')


            if not id:
                id = request.GET.get('id')

            if id:
                req = check(request, id, attrs=None)
                if req == True:
                    item = self.model.objects.select_related(depth=1).get(pk=id)
                    ready_data_true['items'] = item.list()
                    ready_data_true['total'] = 1
                    return ready_data_true
                else:
                    ready_data_false['errors'] = req
                    return ready_data_false
                    
            if action == 'showQtToStockItems':
                items = Item.objects.filter(user=currentProfile.parent_user).exclude(qt_to_stock=None).exclude(qt_to_stock='0')
                data = []
                i = 0
                for item in items:
                    data.append(item.list(i))
                    i = i + 1

                ready_data_true['total'] = len(items)
                ready_data_true['items'] = data

                #ready_data_true['action'] = action
                return ready_data_true

            sort = []
            if 'sort' in request.GET:
                sortAttrib = simplejson.loads(request.GET['sort'])

                for s in sortAttrib:
                    if s['property'] == 'total_cost':
                        s['property'] = 'total_cost'
                    if s['property'] == 'category_name':
                        s['property'] = 'category__name'
                    if s['property'] == 'order_qt':
                        s['property'] = 'order__qt'
                    if s['direction'] == 'DESC':
                        s['property'] = '-' + s['property']
                    sort.append(s['property'])
            else:
                sort.append('name')


            if 'start' in request.GET and 'limit' in request.GET:
                start = int(request.GET['start'])
                limit = start + int(request.GET['limit'])
            else:
                start = 0
                limit = 25
                
            if action == 'inventory':
                sort = []
                sort.append('loc_ret_dept')
                items = Item.objects.filter(user=currentProfile.parent_user).exclude(temp_stock=None). \
                    extra(order_by = sort)[start:limit]
                data = []
                for item in items:
                    data.append(item.list())

                ready_data_true['total'] = len(items)
                ready_data_true['items'] = data

                #ready_data_true['action'] = action
                return ready_data_true

            else:
                show_disabled = True
                if 'show_disabled' in request.GET:
                    if request.GET['show_disabled'].lstrip().rstrip() == 'false':
                        show_disabled = False

                if show_disabled == True:
                     sort.append('-enabled')
                    
                sq = Q()

                if 'search' in request.GET:
                    search  = request.GET['search']
                    words = search.split()
                    sq = Q()

                    if len(words) > 1: # search is multiple words
                        sq_name = Q()
                        sq_name1 = Q()
                        sq_brand = Q()
                        sq_notes = Q()
                        sq_item_notes = Q()
                        for word in words:
                            # on Item
                            sq_name = sq_name & Q(name__icontains=word) # on Item
                            sq_name1 = sq_name1 & Q(orders__product__name1__icontains=word)# on Order
                            sq_brand = sq_brand & Q(orders__product__brand__icontains=word)# on Order
                            sq_notes = sq_notes & Q(orders__product__notes__icontains=word)# on Order
                            sq_item_notes = sq_item_notes & Q(notes__icontains=word)# on Order

                        sq = sq | sq_name | sq_name1 | sq_brand | sq_notes | sq_item_notes

                    else: # search is a single word
                        # on Item
                        sq = sq | Q(upc__icontains=search) | Q(name__icontains=search)
                        sq = sq | Q(upc_2__icontains=search) | Q(upc_3__icontains=search) | Q(upc_case__icontains=search)
                        # on OrderProduct
                        sq = sq | Q(orders__product__product_num__icontains=search) | Q(orders__product__name1__icontains=search)
                        sq = sq | Q(orders__product__upc__icontains=search) | Q(orders__product__brand__icontains=search)
                        sq = sq | Q(orders__product__notes__icontains=search) | Q(notes__icontains=search)

                if 'searchByDept' in request.GET:
                    searchByDept  = request.GET['searchByDept']
                    sq = sq & Q(loc_ret_dept=searchByDept)

                if 'searchByVendor' in request.GET:
                    searchByVendor  = request.GET['searchByVendor']
                    sq = sq & Q(orders__product__vendor=searchByVendor)

                    if 'show_best' in request.GET:
                        show_best  = request.GET['show_best']
                        if show_best == 'true':
                            sq = sq & Q(orders__best_priced=True)

                if show_disabled == True:
                    if len(sq) == 0: # distinct is expensive, if no search let's avoid it
                        items = Item.objects.filter(sq, user=currentProfile.parent_user).extra(order_by = sort)[start:limit] #exclude(enabled=False)
                        count = Item.objects.filter(sq, user=currentProfile.parent_user).count()
                    else:
                        items = Item.objects.filter(sq, user=currentProfile.parent_user).distinct().extra(order_by = sort)[start:limit] #exclude(enabled=False)
                        count = Item.objects.filter(sq, user=currentProfile.parent_user).distinct().count()
                else:
                    if len(sq) == 0: # distinct is expensive, if no search let's avoid it
                        items = Item.objects.filter(sq, user=currentProfile.parent_user, enabled=True).extra(order_by = sort)[start:limit] #exclude(enabled=False)
                        count = Item.objects.filter(sq, user=currentProfile.parent_user, enabled=True).count()
                    else:
                        items = Item.objects.filter(sq, user=currentProfile.parent_user, enabled=True).distinct().extra(order_by = sort)[start:limit] #exclude(enabled=False)
                        count = Item.objects.filter(sq, user=currentProfile.parent_user, enabled=True).distinct().count()

                data = []
                i = 0
                for item in items:
                    data.append(item.list())
                    i = i + 1

                #ready_data_true['len'] = len(items)
                #ready_data_true['sort'] = sort
                #ready_data_true['start'] = start
                #ready_data_true['limit'] = limit
                #ready_data_true['show_disabled'] = show_disabled
                #ready_data_true['sq'] = sq

                ready_data_true['total'] = count
                ready_data_true['items'] = data

                return ready_data_true
                
        except Exception, err:
            logger.error(str(err) + 'REQEST.QUERY_STRING: %s' % str(request.META['QUERY_STRING']))
            ready_data_false['errors'] = err
            return ready_data_false