예제 #1
0
파일: cron.py 프로젝트: wangjun/appetsy
    def _mark_sold(self, listing, item = None):
        if listing.state != "sold_out":
            return

        if item is None:
            item = db.Query(storage.Goods).filter("listing =", listing).get()

        if item:
            item.status = "sold"
            item.sold = dt.datetime.now()

            if item.shop.currency == "LVL":
                item.price = round(float(item.listing.price) * 0.55789873, 2) #exchange rate usd -> lvl feb-23-2010
            else:
                item.price = float(item.listing.price)

            item.put()
            storage.Totals.add_income(item.shop,
                                      appetsy.today(item.shop),
                                      item.price)

            self.log("Marked '%s' as sold." % item.name)

        listing.sold_on = dt.datetime.now()

        listing.put()
        appetsy.invalidate_memcache("goods", str(item.shop.id)) #forget UI listings
예제 #2
0
파일: index.py 프로젝트: wangjun/appetsy
    def progress_box(self):
        income_progress = memcache.get("income_progress",
                                       namespace = str(self.shop.id))
        plan = memcache.get("week_%s_plans" % appetsy.monday(self.shop).strftime("%U"),
                            namespace = str(self.shop.id))

        if not income_progress or not plan:
            # total income for the progress box
            data = {}

            totals = storage.Totals.all().filter("shop =", self.shop) \
                                 .filter("name =", "shop_income").fetch(1000)
            data["total_money"] = sum([total.total for total in totals])

            monday = appetsy.monday(self.shop)

            goods_week = storage.Goods.all().filter("shop =", self.shop) \
                                    .filter("created >=", monday).fetch(100)

            goods_week = [good for good in goods_week if good.status in ("in_stock", "sold")]

            days = {}
            plan = storage.Counters.get_or_insert("%s:week_%s_plans" % (self.shop.id, appetsy.monday(self.shop).strftime("%U")),
                                                  shop = self.shop,
                                                  name = "weeks_plan",
                                                  count = 10,
                                                  timestamp = dt.datetime.combine(appetsy.monday(self.shop), dt.time()))
            planned = plan.count

            for good in goods_week:
                days.setdefault(good.created.weekday(), []).append(good)

            day_max = max(2, max([len(goods) for goods in days.values()] or [0]))
            weekday_count = max(4, max(days.keys() or [0]))

            data["planned"] = planned
            data["days"], data["day_max"], data["weekday_count"] = days, day_max, weekday_count

            data["goods_week"] = goods_week
            if planned > 0:
                weekday = appetsy.today(self.shop).weekday()
                data["percentage_complete"] = "%d" % (len(goods_week) / ((planned / float(max(5.0, weekday + 1))) * (weekday + 1)) * 100)
            else:
                data["percentage_complete"] = None



            income_progress = appetsy.get_template("index/progress_box.html").render(**data)
            memcache.set("income_progress", income_progress, namespace = str(self.shop.id))

        return income_progress
예제 #3
0
파일: etsy.py 프로젝트: wangjun/appetsy
    def index(self):
        """
        fan_list = memcache.get("500fans")
        # TODO we are relying on index.py resetting memcache on day change here
        if fan_list:
            return fan_list
        """
        
        fans = db.Query(storage.ShopFans).filter("shop =", self.shop) \
                                 .order("-favored_on").fetch(limit=500)
        
        fan_counter = storage.Counters.get_by_key_name("%d:fans" % self.shop.id)
        if not fan_counter or not fans or fans[0].favored_on > fan_counter.timestamp:
            fan_counter = self._count_fans(fan_counter)        
        
        fan_count = fan_counter.count
    
        dates = []
        for group in itertools.groupby(fans, lambda entry: appetsy.to_local_time(self.shop, entry.favored_on).date()):
            fans = list(group[1])
            fans.reverse()
            dates.append ({"cur_date": group[0],
                           "fans": fans 
                           })

        #filter out expired and sold listings
    
        data = {
            "dates": dates,
            "now": appetsy.time(self.shop),
            "fan_count": fan_count,
            "today": appetsy.today(self.shop),
            "yesterday": appetsy.today(self.shop) - dt.timedelta(days=1),            
        }
        
        fan_list = appetsy.get_template("etsy.html").render(**data)
        memcache.set("500fans", fan_list)
        return fan_list
예제 #4
0
파일: index.py 프로젝트: wangjun/appetsy
    def fans_today(self):
        today = appetsy.today(self.shop) #- dt.timedelta(days=2)
        if today.date() != memcache.get("today", namespace = str(self.shop.id)):
            appetsy.invalidate_memcache("fans", namespace = str(self.shop.id))

        page = self.request.get("page") or "persons"

        fan_list = memcache.get("fan_list", namespace = str(self.shop.id))

        if not fan_list:  #use cache whenever
            data = {}
            by_fan = {}


            shopfaves = storage.ShopFans.all().filter("shop =", self.shop) \
                                          .filter("favored_on >=", today) \
                                          .fetch(500)
            itemfaves = storage.ItemFans.all().filter("shop =", self.shop) \
                                          .filter("favored_on >=", today) \
                                          .fetch(500)

            data["shopfave_count"] = len(shopfaves)

            for fave in shopfaves:
                fan = dict(user_name = fave.fan.user_name,
                            image_url = fave.fan.image_url,
                            favored_on = fave.favored_on,
                            key = str(fave.fan.key()),
                            count = 0)
                by_fan[fave.fan.user_name] = fan


            data["itemfave_count"] = len(itemfaves)

            by_listing = {}
            for fave in itemfaves:
                listing = dict(title = fave.listing.title,
                               key = str(fave.listing.key()),
                               image_url = fave.listing.image_url,
                               count = 0,
                               favored_on = fave.favored_on)
                by_listing.setdefault(fave.listing.id, listing)
                by_listing[fave.listing.id]["count"] += 1
                by_listing[fave.listing.id]["favored_on"] = min(by_listing[fave.listing.id]["favored_on"],
                                                                fave.favored_on)


                fan = dict(user_name = fave.fan.user_name,
                            image_url = fave.fan.image_url,
                            key = str(fave.fan.key()),
                            favored_on = fave.favored_on,
                            count = 0)

                by_fan.setdefault(fave.fan.user_name, fan)
                by_fan[fave.fan.user_name]["favored_on"] = min (by_fan[fave.fan.user_name]["favored_on"],
                                                                fave.favored_on)
                by_fan[fave.fan.user_name]["count"] += 1

            data["shopfaves"] = sorted(by_fan.values(), key = lambda x: x["favored_on"])
            data["listingfaves"] = sorted(by_listing.values(), key = lambda x: x["favored_on"])


            fan_list = appetsy.get_template("index/fans_today.html").render(**data)
            memcache.set("fan_list", fan_list, namespace = str(self.shop.id))
            memcache.set("today", today.date(), namespace = str(self.shop.id))

        #lame current page hack to avoid breaking the cache
        if page == "persons":
            fan_list = fan_list.replace('<div id="person_box" style="display: none">', '<div id="person_box">')
        else:
            fan_list = fan_list.replace('<div id="item_box" style="display: none">', '<div id="item_box">')

        return fan_list
예제 #5
0
파일: expenses.py 프로젝트: wangjun/appetsy
    def balance(self):
        balance_month = self.request.get("month")
        if balance_month:
            this_month = dt.datetime.strptime(balance_month, "%d-%b-%Y").date()
        else:
            this_month = appetsy.today(self.shop).replace(day = 1).date()
            
        # timedelta doesn't do month, so we just add maximum possible days and roll back to first one
        next_month = (this_month + dt.timedelta(days=31)).replace(day=1)
        
        balance_cache = memcache.get("balance", namespace = str(self.shop.id)) or {}
        
        if this_month not in balance_cache:
            expenses = storage.Expenses.all().filter("shop =", self.shop) \
                                     .filter("purchase_date >=", this_month) \
                                     .filter("purchase_date <", next_month) \
                                     .order("purchase_date")        
            for expense in expenses:
                expense.price = -expense.price
                
            goods = storage.Goods.all().filter("status =", "sold") \
                               .filter("shop =", self.shop) \
                               .filter("sold >", this_month) \
                               .filter("sold <", next_month) \
                               .order("sold") \
                               .order("status")
            
            moneys = []
            
            for expense in expenses:
                moneys.append({"date": expense.purchase_date,
                               "price": -(expense.price or 0),
                               "name": expense.name,
                               "creation_date": None,
                               "key": expense.key()
                })
                
            for good in goods:
                moneys.append({"date": good.sold.date(),
                               "price": good.price or 0,
                               "name": good.name,
                               "creation_date": good.created,
                               "key": good.key(),
                               "listing": good.listing
                })
                
            moneys.sort(key = lambda x: x["date"])
            
            
            dates = []
            for group in itertools.groupby(moneys, lambda entry: entry["date"].month):
                dates.append ({"month": group[0],
                               "moneys": [z for z in group[1]]
                               })
            dates.reverse()
            
            prev_totals = storage.Totals.all().filter("shop =", self.shop) \
                                      .filter("name in", ["shop_income"]) \
                                      .fetch(500)
            
            prev_totals = appetsy.totals(prev_totals,
                                            lambda x: x.date.date().replace(day=1),
                                            lambda x: x.total)
            
            
            balance_cache[this_month] = appetsy.get_template("expenses/index.html").render(dates = dates, prev = prev_totals)
            memcache.set("balance", balance_cache, namespace = str(self.shop.id))


        spotlight = self.request.get("spotlight")
        
        balance = balance_cache[this_month]
        if spotlight:
            balance = balance.decode("utf-8").replace("balance_spotlight = null",
                                                      "balance_spotlight = \"%s\"" % spotlight).encode("utf-8")

        return balance
예제 #6
0
파일: fans.py 프로젝트: wangjun/appetsy
    def faves(self, key):    
        if isinstance(key, db.Model):
            item = key
        else:
            key = db.Key(key)
            if not key:
                return "need key"
            item = db.get(key)
        
        data = dict(today = [], other_days = [])
        data['shop'] = self.shop

        today = appetsy.today(self.shop)
        
        if item.kind() == "Fans":
            faves = storage.ItemFans.all() \
                           .filter("fan =", item) \
                           .order("-favored_on").fetch(500)

            for fave in faves:
                fave.image_url = fave.listing.image_url
                fave.str_key = fave.listing.key()
                fave.user_name = ""

                if appetsy.zero_timezone(fave.favored_on) >= today:
                    data["today"].append(fave)
                else:
                    data["other_days"].append(fave)

            shopfave = storage.ShopFans.all() \
                                       .filter("fan =", item) \
                                       .filter("shop =", self.shop).get()

            if shopfave:
                shopfave.image_url = "veikals"
                shopfave.str_key = ""
                shopfave.user_name = ""

                if appetsy.zero_timezone(shopfave.favored_on) >= today:
                    data["today"].append(shopfave)
                    data["today"] = sorted(data["today"], key=lambda x:x.favored_on, reverse = True)
                else:
                    data["other_days"].append(shopfave)
                    data["other_days"] = sorted(data["other_days"], key=lambda x:x.favored_on, reverse = True)
        else:
            itemfans = storage.ItemFans.all() \
                              .filter("listing =", item) \
                              .filter("shop =", item.shop) \
                              .order("-favored_on").fetch(500)

            for item in itemfans:
                fave = item.fan
                fave.str_key = item.fan.key()
                fave.user_name = item.fan.user_name

                if appetsy.zero_timezone(item.favored_on) >= today:
                    data["today"].append(fave)
                else:
                    data["other_days"].append(fave)
        

        return appetsy.get_template("/fans/faves.html").render(**data)