Rev 1617 | Blame | Last modification | View Log | RSS feed
'''Created on 20-Jul-2010@author: ashish'''from shop2020.thriftpy.model.v1.user.ttypes import WidgetException as WExceptionfrom shop2020.thriftpy.model.v1.user.ttypes import WidgetType as WTypefrom shop2020.model.v1.user.impl.Dataservice import Widget, Item, WidgetItemfrom elixir import *from sqlalchemy import descfrom sqlalchemy.orm import join, contains_eagerimport datetimedef get_widget_by_id(id):return Widget.get_by(id=id)def get_item_by_id(id):return Item.get_by(id=id)def get_item_by_item_id(item_id):return Item.get_by(item_id=item_id)def get_widget_item(item, widget):try:query = WidgetItem.query.filter_by(item=item)query = query.filter_by(widget=widget)return query.one()except:return Nonedef add_widget(widget):if not widget:raise WException(101, "Cannot add null widget")if widget.id:raise WException(101, "id is already assigned")w = Widget()if widget.customer_id:w.customer_id = widget.customer_idw.type = widget.typew.name = widget.namew.enabled = Truesession.commit()for item in widget.items:w_item = get_item_by_item_id(item.item_id)if not w_item:#item is not present in system, we need to add the itemw_item = Item()w_item.item_id = item.item_idw_item.enabled = Truesession.commit()#create a widgetitem mapping here nowwidget_item = get_widget_item(w_item, w)if not widget_item:widget_item = WidgetItem()widget_item.widget = wwidget_item.item = w_itemwidget_item.added_on = datetime.datetime.now()session.commit()def add_items_to_widget(widget_id, items):widget = get_widget_by_id(widget_id)if not widget:raise WException(101, "Widget not found")for itemid in items:item = get_item_by_item_id(itemid)if item is None:item = Item()item.item_id = itemiditem.enabled = Truesession.commit()#check if widgetitem is already presentwitem = get_widget_item(item, widget)if not witem:witem = WidgetItem()witem.widget = widgetwitem.item = itemwitem.added_on = datetime.datetime.now()session.commit()def get_my_research_widget(userId):query = Widget.query.filter_by(user_id=userId)query = query.filter_by(type=WType.MY_RESEARCH)query = query.filter_by(enabled=1)try:widget = query.one()return widgetexcept:return Nonedef update_my_research(userId, itemId):isNew = False#get my research widgetresearch_widget = get_my_research_widget(userId)if not research_widget:#research widget not presentresearch_widget = Widget()research_widget.type = WType.MY_RESEARCHresearch_widget.enabled = Trueresearch_widget.user_id = userIdresearch_widget.name = "My Research"session.commit()#search for item iditem = get_item_by_item_id(itemId)if not item:#Ideally it should throw an exception, but we are allowing additions here for now.item = Item()item.item_id = itemIditem.enabled = Truesession.commit()witem = get_widget_item(item, research_widget)if not witem:witem = WidgetItem()witem.widget = research_widgetwitem.item = itemisNew = Truewitem.added_on = datetime.datetime.now()session.commit()return isNewdef delete_item_from_widget(widget_id, item_id):widget = get_widget_by_id(widget_id)item = get_item_by_item_id(item_id)if not item:#ideally it should throw an exception, but we are returning simplyreturnquery = WidgetItem.query.filter_by(item=item)query = query.filter_by(widget=widget)witem = query.one()witem.delete()session.commit()returndef delete_item_from_my_research(userId, itemId):#get my research widgetresearch_widget = get_my_research_widget(userId)#search for item iddelete_item_from_widget(research_widget.id, itemId )def update_widget(widget_id, enabled):widget = get_widget_by_id(widget_id)if not widget:raise WException(101, "widget not present")if enabled:widget.enabled = Trueelse:widget.enabled = Falsesession.commit()def get_widget_by_user_id(type, userId, enabled):try:query = Widget.query.filter_by(type = type)query = query.filter_by(userId=userId)if enabled:query = query.filter_by(enabled=enabled)return query.one()except:raise WException(101, "no widget found")def get_my_research(userId):query = Widget.query.filter_by(user_id=userId)query = query.filter_by(type=WType.MY_RESEARCH)query = query.filter_by(enabled=1)try:widget = query.one()return widgetexcept:widget = Widget()widget.type = WType.MY_RESEARCHwidget.enabled = Truewidget.user_id = userIdwidget.name = "My Research"return widgetdef get_browse_history(userId):query = session.query(WidgetItem).join(Widget).join(Item)query = query.filter(Widget.user_id == userId).filter(Widget.type == WType.BROWSE_HISTORY).filter(Widget.enabled == 1)query = query.order_by(desc(WidgetItem.added_on)).limit(10)widgetitems = query.options(contains_eager(WidgetItem.widget)).options(contains_eager(WidgetItem.item)).all()widget = Widget()widget.type = WType.BROWSE_HISTORYwidget.enabled = Truewidget.user_id = userIdwidget.name = "Browse History"if widgetitems is not None:for widgetitem in widgetitems:if widget.id is None:widget.id = widgetitem.widget.idwidget.items.append(widgetitem)else:session.commit()return widgetdef update_browse_history(userId, itemId):query = Widget.query.filter_by(user_id = userId)query = query.filter_by(type = WType.BROWSE_HISTORY)try:current_widget = query.one()except:current_widget = Widget()current_widget.user_id = userIdcurrent_widget.enabled = Truecurrent_widget.type = WType.BROWSE_HISTORYcurrent_widget.name = "Browse History"session.commit()items = []items.append(itemId)add_items_to_widget(current_widget.id, items)def merge_browse_history(fromUserId, toUserId):passdef close_session():if session.is_active:print "session is active. closing it."session.close()'''def get_ratings(user_id, item_id):query = Ratings.query.filter_by(item_id = item_id)type_ratings = query.all()if user_id:query = UserRatings.query.filter_by(item_id = item_id)query = query.filter_by(user_id = user_id)try:user_rating = query.one()except:return type_ratings, Nonereturn type_ratings, user_ratingreturn type_ratings, Nonedef update_ratings(user_id, item_id, rating, type):if user_id:if type == RType.USER_CURRENT:query = UserRatings.query.filter_by(item_id = item_id)query = query.filter_by(user_id = user_id)try:user_rating = query.one()except:user_rating = UserRatings()user_rating.user_id = user_iduser_rating.item_id = item_iduser_rating.rating = ratingsession.commit()#update cumulative ratingsquery = UserRatings.query.filter_by(item_id = item_id)ratings = query.all()user_count = len(ratings)query = Ratings.query.filter_by(item_id = item_id)query = Ratings.query.filter_by(type = RType.USER_ALL)try:current_rating = query.one()new_rating = (current_rating.rating*(user_count -1) + rating)/user_countcurrent_rating.rating = new_ratingexcept:current_rating = Ratings()current_rating.type= RType.USER_ALLcurrent_rating.item_id = item_idcurrent_rating.rating = ratingsession.commit()else:query = Ratings.query.filter_by(item_id = item_id)query = Ratings.query.filter_by(type = type)try:current_rating = query.one()current_rating.rating = ratingexcept:current_rating = Ratings()current_rating.type= typecurrent_rating.item_id = item_idcurrent_rating.rating = ratingsession.commit()'''