diff options
author | Alvin Li <liweitianux@gmail.com> | 2013-09-20 23:52:59 +0800 |
---|---|---|
committer | Alvin Li <liweitianux@gmail.com> | 2013-09-20 23:52:59 +0800 |
commit | c9da4168874296cf4f5ba71b9a432ceae3c26130 (patch) | |
tree | 0c986d630c9634b8dbbbbe694546b42c7bb74210 /97suifangqa/apps/indicator/tools.py | |
parent | 62efe8809e2cdfc84666dbd5e987a4ce473a047a (diff) | |
download | 97dev-c9da4168874296cf4f5ba71b9a432ceae3c26130.tar.bz2 |
*** merged changes of front pages ***
* merged changes from '97suifang-front' by mjymjydark;
and modified to work with django
* finished 'editing_data' div of 'SheetDefault' for add new record
* added 'indicator.views.ajax_add_record()'
*** search ***
* improved 'search' function of 'NewDeleteIndex' page;
employ AJAX to load search results;
* added 'indicator.views.search_indicators()'
*** recommend indicator ***
* improved the functions of 'recommend_indicator'
* added 'sciblog.models.UserCollection' to record the collection
information for each user
* improved 'sciblog.views.add_user_to_m2m()' to work with
'UserCollection'
* added field 'lastRecommendTime' in 'indicator.models.UserIndicator'
* updated 'indicator.views.indicator_status' against 'recommend_indicator'
*** qtip2 for recommended indicator ***
* added 'qtip2' tooltip for recommended indicator card
* added '97suifang' qtip css (qtip-sf)
* added tooltip for 'add record' when return error (SheetDefault page);
* improved the style of 'collection_btn' and 'go_library_btn' of
IndexDesc page;
Diffstat (limited to '97suifangqa/apps/indicator/tools.py')
-rw-r--r-- | 97suifangqa/apps/indicator/tools.py | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/97suifangqa/apps/indicator/tools.py b/97suifangqa/apps/indicator/tools.py index 883c2f2..1a9e6ab 100644 --- a/97suifangqa/apps/indicator/tools.py +++ b/97suifangqa/apps/indicator/tools.py @@ -28,6 +28,7 @@ def follow_indicator(user_id, indicator_id): # to remove the indicator from 'followedHistories' if exists if indicator in ui.followedHistories.all(): ui.followedHistories.remove(indicator) + ui.save() return True except: return False @@ -46,6 +47,7 @@ def unfollow_indicator(user_id, indicator_id): ui.followedIndicators.remove(indicator) # add indicator to 'followedHistories' ui.followedHistories.add(indicator) + ui.save() return True except: return False @@ -106,6 +108,7 @@ def get_followed_indicator(user_id, category_id="all", startswith="all"): u = User.objects.get(id=user_id) ui, created = im.UserIndicator.objects.get_or_create(user=u) + ui.save() _idict = {} iqueryset = ui.followedIndicators.all() if not category_id == 'all': @@ -141,6 +144,7 @@ def get_unfollowed_indicator(user_id, category_id="all", startswith="all"): u = User.objects.get(id=user_id) ui, created = im.UserIndicator.objects.get_or_create(user=u) + ui.save() _idict = {} # XXX: if 'exclude(followed_indicators=ui)' OK?? iqueryset = im.Indicator.objects.exclude(followed_indicators=ui) @@ -443,6 +447,7 @@ def add_recordhistory(user_id, record_id, reason, created_at=None): return True # }}} + # types of recommended indicators, and weights {{{ RI_TYPES = { 'ANNOTATION_COLLECTED': u'ANN_CL', @@ -515,11 +520,14 @@ def calc_indicator_weight(user_id, indicator_id): # recommend_indicator {{{ -def recommend_indicator(user_id, number): +def recommend_indicator(user_id, number=1, auto_follow=False): """ recommend unfollowed indicator for user, based on his/her readings and collections. + if auto_follow=True, then the recommended indicators are + followed automatically. + return a list of recommended indicators in format: [ {'id': id, 'weight': w, 'type': t}, ... ] """ @@ -528,7 +536,7 @@ def recommend_indicator(user_id, number): # get unfollowed indicators u = User.objects.get(id=user_id) ui, created = im.UserIndicator.objects.get_or_create(user=u) - # XXX: if 'exclude(followed_indicators=ui)' OK?? + # XXX: is 'exclude(followed_indicators=ui)' OK?? uf_ind_qs = im.Indicator.objects.exclude(followed_indicators=ui) # calc weight for each unfollowed indicator weights = [] @@ -542,8 +550,19 @@ def recommend_indicator(user_id, number): # sort 'weights' dict list by key 'weight' weights_sorted = sorted(weights, key=lambda item: item['weight']) weights_sorted.reverse() - # return results with largest weights - return weights_sorted[:number] + # results with largest weights + results = weights_sorted[:number] + # update 'lastRecommendTime' of 'UserIndicator' + now_utc = datetime.datetime.utcnow().replace(tzinfo=utc) + ui.lastRecommendTime = now_utc + # updated followedIndicators of 'auto_follow=True' + if auto_follow: + for wi in results: + follow_indicator(user_id, wi['id']) + # save 'UserIndicator' + ui.save() + # + return results # }}} @@ -676,3 +695,4 @@ def format_data(indicator_obj, value=None, val_max=None, val_min=None, type="htm return value_str # }}} + |