def aggregate_cases(self, product_cases, slugs): cases_by_product = map_reduce(lambda c: [(c.product,)], data=product_cases, include_docs=True) products = Product.view('_all_docs', keys=cases_by_product.keys(), include_docs=True) def _sum(vals): return sum(vals) if vals else None def aggregate_product(cases): data = [(c.current_stock_level, c.monthly_consumption) for c in cases if is_timely(c, 1000)] total_stock = _sum([d[0] for d in data if d[0] is not None]) total_consumption = _sum([d[1] for d in data if d[1] is not None]) # exclude stock values w/o corresponding consumption figure from total months left calculation consumable_stock = _sum([d[0] for d in data if d[0] is not None and d[1] is not None]) return { 'total_stock': total_stock, 'total_consumption': total_consumption, 'consumable_stock': consumable_stock, } status_by_product = dict((p, aggregate_product(cases)) for p, cases in cases_by_product.iteritems()) for p in sorted(products, key=lambda p: p.name): stats = status_by_product[p._id] months_left = SPPCase.months_of_stock_remaining(stats['consumable_stock'], stats['total_consumption']) category = SPPCase.stock_category(stats['total_stock'], stats['total_consumption'], stats['consumable_stock']) full_output = { self.SLUG_PRODUCT_NAME: p.name, self.SLUG_PRODUCT_ID: p._id, self.SLUG_LOCATION_ID: self.active_location._id if self.active_location else None, self.SLUG_LOCATION_LINEAGE: self.active_location.lineage if self.active_location else None, self.SLUG_CURRENT_STOCK: stats['total_stock'], self.SLUG_CONSUMPTION: stats['total_consumption'], self.SLUG_MONTHS_REMAINING: months_left, self.SLUG_CATEGORY: category, } yield dict((slug, full_output['slug']) for slug in slugs) if slugs else full_output
def get_prod_data(self): startkey = [self.domain, self.active_location._id if self.active_location else None] product_cases = SPPCase.view('commtrack/product_cases', startkey=startkey, endkey=startkey + [{}], include_docs=True) cases_by_product = map_reduce(lambda c: [(c.product,)], data=product_cases, include_docs=True) products = Product.view('_all_docs', keys=cases_by_product.keys(), include_docs=True) def _sum(vals): return sum(vals) if vals else None def aggregate_product(cases): data = [(c.current_stock_level, c.monthly_consumption) for c in cases if is_timely(c, 1000)] total_stock = _sum([d[0] for d in data if d[0] is not None]) total_consumption = _sum([d[1] for d in data if d[1] is not None]) # exclude stock values w/o corresponding consumption figure from total months left calculation consumable_stock = _sum([d[0] for d in data if d[0] is not None and d[1] is not None]) return { 'total_stock': total_stock, 'total_consumption': total_consumption, 'consumable_stock': consumable_stock, } status_by_product = dict((p, aggregate_product(cases)) for p, cases in cases_by_product.iteritems()) for p in sorted(products, key=lambda p: p.name): stats = status_by_product[p._id] months_left = SPPCase.months_of_stock_remaining(stats['consumable_stock'], stats['total_consumption']) category = SPPCase.stock_category(stats['total_stock'], stats['total_consumption'], stats['consumable_stock']) yield [ p.name, stats['total_stock'], stats['total_consumption'], months_left, category, ]