def process_item(rent_list_item): """ Blah """ user = rent_list_item.user profile = user.get_profile() zip_code = profile.shipping_zip rent_list = RentList.objects.filter(user=user, rent_order=None) def chain_objects(o1, objects=[]): return itertools.chain([o1] if o1 else [], itertools.ifilter(lambda x: x != o1, objects)) debug("Home DC: %s", profile.dropship) from project.inventory.models import Dropship dropships = list(chain_objects(profile.dropship, Dropship.list_by_distance(zip_code))) def find_dropship(item): for dropship in dropships: if dropship.is_game_available(item, for_rent=True): return dropship return None rent_plan = MemberRentalPlan.get_current_plan(user) for list_item in chain_objects(rent_list_item, rent_list): dc = find_dropship(list_item.item) debug("Processing: %s %s...", list_item.user, list_item.item) if not dc: # TODO: Create report debug("Create report") continue if not rent_plan.is_valid(): return False order = RentOrder.create(user, list_item, dc) debug("Rent order was created: %s", order) return True return False
def import_rent_orders(self, user_id): user = User.objects.get(id=user_id) shipping = user.get_profile().get_shipping_address_data('shipping') def get_label_data(history_record_id, label_type): c = self.mconn.cursor() c.execute(''' select image_filename, tracking_code FROM endicia_labels where ref_history_record = %s and label_type = %s ''', [history_record_id, label_type]) for image_filename, tracking_code in c.fetchall(): return image_filename, tracking_code return None, None c = self.mconn.cursor() c.execute(''' select i.upc, h.sent_date, group_concat(h.delivered_date order by h.delivered_date), h.sent_code, group_concat(h.from_center order by h.from_center), group_concat(h.returned_date order by h.returned_date), group_concat(h.id order by h.id) from history_records h inner join items i on i.id=h.ref_item where h.ref_user = %s group by h.ref_item, h.sent_date, h.sent_code order by h.sent_date ''', [user_id,]) for upc, sent_date, delivered_date, sent_code, from_center, returned_date, history_record_id in c.fetchall(): delivered_date = delivered_date.split(',')[-1] delivered_date = datetime.strptime(delivered_date, '%Y-%m-%d %H:%M:%S') if delivered_date != '0000-00-00 00:00:00' else None from_center = int(from_center.split(',')[-1]) returned_date = returned_date.split(',')[-1] returned_date = datetime.strptime(returned_date, '%Y-%m-%d') if returned_date != '0000-00-00' else None history_record_id = int(history_record_id.split(',')[-1]) item = self.get_item(upc) if not item: if returned_date is None: self.missing_items.add(id) continue outgoing_mail_label, outgoing_tracking_number = get_label_data(history_record_id, 'rental_mailing') incoming_mail_label, incoming_tracking_number = get_label_data(history_record_id, 'rental_return') if outgoing_mail_label: outgoing_mail_label = 'media/labels/old/endicia/' + outgoing_mail_label if incoming_mail_label: incoming_mail_label = 'media/labels/old/endicia/' + incoming_mail_label o = RentOrder( user = user, item = item, status = RentOrderStatus.Returned if returned_date else RentOrderStatus.Shipped, date_rent = sent_date, date_prepared = sent_date, date_shipped = sent_date, date_delivered = delivered_date, date_returned = returned_date, source_dc_id = self.DROPSHIP_MAP.get(from_center), inventory = self.entries.get(sent_code), first_name = user.first_name, last_name = user.last_name, outgoing_mail_label = outgoing_mail_label, outgoing_tracking_number = outgoing_tracking_number, incoming_mail_label = incoming_mail_label, incoming_tracking_number = incoming_tracking_number, **shipping ) o.save()
def do_process_cancellations(self): debug("Processing expired plans...") for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.Expired): user = p.user orders = RentOrder.list_stolen_games(user) if orders.count() == 0: p.delete() continue for order in orders.filter(penalty_payment=None): order.take_penalty_payment() if p.expiration_date > datetime.datetime.now().date() - datetime.timedelta(10): continue if p.buy_games_at_home(): p.delete() continue p.status = RentalPlanStatus.Collection p.save() debug("Processing plans that could be canceled...") for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.CanceledP): user = p.user orders = RentOrder.list_stolen_games(user) if orders.count() == 0: debug("There is no games at home. Subscription could be canceled") p.finish_cancellation() continue if not p.cancellation_date: continue if orders.filter(date_rent__lt=datetime.datetime(2010, 10, 1)).count(): # FIXME: temporary stub continue has_claims = False for o in orders: has_claims = o.claims().count() > 0 if has_claims: break if has_claims: continue if p.cancellation_date < datetime.datetime(2010, 12, 23).date() - datetime.timedelta(10): p.cancellation_date = None debug("Processing %s...", p.user) for order in orders.filter(penalty_payment=None): order.take_penalty_payment() if not p.cancellation_date: p.cancellation_date = datetime.datetime.now().date() p.save() date_x = datetime.datetime.now().date() - datetime.timedelta(10) if p.cancellation_date > date_x: debug("User has %s day(s) to return rented games", (p.cancellation_date - date_x).days) continue if p.buy_games_at_home(): debug("All games are sold. Subscription could be canceled") p.finish_cancellation() continue debug('Changing plan status to "Collection"...') p.status = RentalPlanStatus.Collection p.save() debug("Processing plans that was suspended...") for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.Suspended): user = p.user orders = RentOrder.list_stolen_games(user) if orders.count() == 0: continue debug("Processing %s...", p.user) for order in orders.filter(penalty_payment=None): order.take_penalty_payment(penalty_reason=("SUSP", "Rent Suspension")) date_x = datetime.datetime.now() - datetime.timedelta(10) if p.suspend_date is None: p.suspend_date = datetime.datetime.now() p.save() if p.suspend_date > date_x: debug("User has %s day(s) to return rented games", (p.suspend_date - date_x).days) continue if p.buy_games_at_home(description="Rent Suspension", penalty_reason=("SUSP", "Rent Suspension")): continue debug('Changing plan status to "Collection"...') p.status = RentalPlanStatus.Collection p.save()