2010-04-27 17:35:51 -04:00
import logging
import datetime
2010-07-07 16:22:26 -04:00
import random
2010-06-14 01:01:21 -04:00
from django . shortcuts import render_to_response , get_object_or_404
2009-06-16 03:08:55 +00:00
from django . contrib . auth . decorators import login_required
from django . template import RequestContext
2009-09-08 04:27:27 +00:00
from django . db import IntegrityError
2010-01-24 22:53:46 -05:00
from django . views . decorators . cache import never_cache
2010-04-06 20:41:00 -04:00
from django . db . models import Q
2010-01-24 22:53:46 -05:00
from django . core . urlresolvers import reverse
2010-04-27 17:56:16 -04:00
from django . contrib . auth import login as login_user
2010-07-20 23:59:56 -04:00
from django . contrib . auth . models import User
2010-06-14 01:01:21 -04:00
from django . http import HttpResponse , HttpResponseRedirect , HttpResponseForbidden
2010-07-20 23:59:56 -04:00
from django . conf import settings
2010-01-21 13:12:29 -05:00
from apps . analyzer . models import ClassifierFeed , ClassifierAuthor , ClassifierTag , ClassifierTitle
from apps . analyzer . models import apply_classifier_titles , apply_classifier_feeds , apply_classifier_authors , apply_classifier_tags
2010-03-23 20:03:40 -04:00
from apps . analyzer . models import get_classifiers_for_user
2010-06-12 21:20:06 -04:00
from apps . reader . models import UserSubscription , UserSubscriptionFolders , UserStory , Feature
from apps . reader . forms import SignupForm , LoginForm , FeatureForm
2010-06-29 20:16:09 -04:00
from apps . feed_import . views import import_from_google_reader
2010-04-27 17:35:51 -04:00
try :
2010-07-01 15:16:33 -04:00
from apps . rss_feeds . models import Feed , Story , FeedPage
2010-04-27 17:35:51 -04:00
except :
pass
2010-07-27 22:11:23 -04:00
from utils import json , urlnorm
2010-07-24 15:54:25 -04:00
from utils . user_functions import get_user , ajax_login_required
2010-07-26 21:38:56 -04:00
from utils . feed_functions import fetch_address_from_page , format_relative_date
2009-06-16 03:08:55 +00:00
2009-07-28 02:27:27 +00:00
SINGLE_DAY = 60 * 60 * 24
2009-08-08 16:52:11 +00:00
2010-01-24 22:53:46 -05:00
@never_cache
2009-06-16 03:08:55 +00:00
def index ( request ) :
2010-04-03 00:59:03 -04:00
if request . method == " POST " :
2010-04-22 21:17:00 -04:00
if request . POST [ ' submit ' ] == ' login ' :
login_form = LoginForm ( request . POST , prefix = ' login ' )
signup_form = SignupForm ( prefix = ' signup ' )
else :
login_form = LoginForm ( prefix = ' login ' )
signup_form = SignupForm ( request . POST , prefix = ' signup ' )
2010-04-03 00:59:03 -04:00
else :
2010-04-22 21:17:00 -04:00
login_form = LoginForm ( prefix = ' login ' )
signup_form = SignupForm ( prefix = ' signup ' )
2010-06-12 21:20:06 -04:00
2010-06-28 19:57:49 -04:00
if request . session . get ( ' import_from_google_reader ' , False ) :
import_from_google_reader ( request . user )
2010-06-29 20:16:09 -04:00
del request . session [ ' import_from_google_reader ' ]
2010-06-28 19:57:49 -04:00
2010-06-30 16:18:55 -04:00
features = Feature . objects . all ( ) [ : 3 ]
2010-06-12 21:20:06 -04:00
feature_form = None
if request . user . is_staff :
feature_form = FeatureForm ( )
2010-06-11 20:55:38 -04:00
2010-07-07 16:22:26 -04:00
howitworks_page = random . randint ( 0 , 5 )
2010-04-22 21:17:00 -04:00
return render_to_response ( ' reader/feeds.xhtml ' , {
' login_form ' : login_form ,
' signup_form ' : signup_form ,
2010-06-12 21:20:06 -04:00
' feature_form ' : feature_form ,
2010-06-28 19:57:49 -04:00
' features ' : features ,
' import_from_google_reader ' : import_from_google_reader ,
2010-07-07 16:22:26 -04:00
' howitworks_page ' : howitworks_page ,
2010-04-22 21:17:00 -04:00
} , context_instance = RequestContext ( request ) )
2009-06-16 03:08:55 +00:00
2010-01-24 22:53:46 -05:00
@never_cache
2010-01-17 20:00:12 -05:00
def login ( request ) :
2010-01-24 22:53:46 -05:00
if request . method == " POST " :
2010-04-22 21:17:00 -04:00
form = LoginForm ( request . POST , prefix = ' login ' )
2010-01-24 22:53:46 -05:00
if form . is_valid ( ) :
2010-04-27 17:56:16 -04:00
login_user ( request , form . get_user ( ) )
2010-07-21 23:26:26 -04:00
print " ---> Login: %s " % form . get_user ( )
2010-01-24 22:53:46 -05:00
return HttpResponseRedirect ( reverse ( ' index ' ) )
return index ( request )
2010-04-22 21:17:00 -04:00
@never_cache
def signup ( request ) :
if request . method == " POST " :
form = SignupForm ( prefix = ' signup ' , data = request . POST )
if form . is_valid ( ) :
new_user = form . save ( )
2010-04-27 17:56:16 -04:00
login_user ( request , new_user )
2010-07-23 22:17:58 -04:00
print " ---> NEW SIGNUP: %s " % new_user
2010-04-22 21:17:00 -04:00
return HttpResponseRedirect ( reverse ( ' index ' ) )
return index ( request )
2010-01-17 20:00:12 -05:00
2010-01-24 22:53:46 -05:00
@never_cache
def logout ( request ) :
print " Logout: %s " % request . user
from django . contrib . auth import logout
logout ( request )
return HttpResponseRedirect ( reverse ( ' index ' ) )
2010-07-25 23:13:27 -04:00
@json.json_view
2009-06-16 03:08:55 +00:00
def load_feeds ( request ) :
user = get_user ( request )
2010-02-11 01:28:47 -05:00
feeds = { }
2010-03-02 10:56:25 -05:00
try :
folders = UserSubscriptionFolders . objects . get ( user = user )
except UserSubscriptionFolders . DoesNotExist :
data = dict ( feeds = [ ] , folders = [ ] )
2010-07-25 23:13:27 -04:00
return data
2010-03-02 10:56:25 -05:00
2010-02-11 01:28:47 -05:00
user_subs = UserSubscription . objects . select_related ( ' feed ' ) . filter ( user = user )
2009-07-19 00:39:59 +00:00
2010-02-11 01:28:47 -05:00
for sub in user_subs :
2010-04-08 18:36:48 -04:00
if sub . needs_unread_recalc :
sub . calculate_feed_scores ( )
2010-02-11 01:28:47 -05:00
feeds [ sub . feed . pk ] = {
' id ' : sub . feed . pk ,
' feed_title ' : sub . feed . feed_title ,
' feed_link ' : sub . feed . feed_link ,
2010-04-14 22:58:00 -04:00
' ps ' : sub . unread_count_positive ,
' nt ' : sub . unread_count_neutral ,
' ng ' : sub . unread_count_negative ,
2010-07-26 21:38:56 -04:00
' updated ' : format_relative_date ( sub . feed . last_update ) ,
2010-02-11 01:28:47 -05:00
}
2009-07-28 02:27:27 +00:00
2010-02-11 01:28:47 -05:00
data = dict ( feeds = feeds , folders = json . decode ( folders . folders ) )
2010-07-25 23:13:27 -04:00
return data
2010-04-14 22:58:00 -04:00
2010-07-25 23:13:27 -04:00
@json.json_view
2010-06-20 11:04:23 -04:00
def load_feeds_iphone ( request ) :
user = get_user ( request )
feeds = { }
try :
folders = UserSubscriptionFolders . objects . get ( user = user )
except UserSubscriptionFolders . DoesNotExist :
data = dict ( folders = [ ] )
2010-07-25 23:13:27 -04:00
return data
2010-06-20 11:04:23 -04:00
user_subs = UserSubscription . objects . select_related ( ' feed ' ) . filter ( user = user )
for sub in user_subs :
if sub . needs_unread_recalc :
sub . calculate_feed_scores ( )
feeds [ sub . feed . pk ] = {
' id ' : sub . feed . pk ,
' feed_title ' : sub . feed . feed_title ,
' feed_link ' : sub . feed . feed_link ,
' ps ' : sub . unread_count_positive ,
' nt ' : sub . unread_count_neutral ,
' ng ' : sub . unread_count_negative ,
}
folders = json . decode ( folders . folders )
flat_folders = { }
def make_feeds_folder ( items , parent_folder = " " , depth = 0 ) :
for item in items :
if isinstance ( item , int ) :
feed = feeds [ item ]
if not parent_folder :
parent_folder = ' '
if parent_folder in flat_folders :
flat_folders [ parent_folder ] . append ( feed )
else :
flat_folders [ parent_folder ] = [ feed ]
elif isinstance ( item , dict ) :
for folder_name in item :
folder = item [ folder_name ]
flat_folder_name = " %s %s %s " % (
parent_folder ,
" - " if parent_folder else " " ,
folder_name
)
make_feeds_folder ( folder , flat_folder_name , depth + 1 )
make_feeds_folder ( folders )
data = dict ( flat_folders = flat_folders )
2010-07-25 23:13:27 -04:00
return data
2010-06-20 11:04:23 -04:00
2010-07-25 23:13:27 -04:00
@json.json_view
2010-04-14 22:58:00 -04:00
def refresh_feeds ( request ) :
user = get_user ( request )
feeds = { }
user_subs = UserSubscription . objects . select_related ( ' feed ' ) . filter ( user = user )
for sub in user_subs :
if sub . needs_unread_recalc :
sub . calculate_feed_scores ( )
feeds [ sub . feed . pk ] = {
' ps ' : sub . unread_count_positive ,
' nt ' : sub . unread_count_neutral ,
' ng ' : sub . unread_count_negative ,
}
2010-07-25 23:13:27 -04:00
return feeds
2009-06-16 03:08:55 +00:00
2010-07-25 23:13:27 -04:00
@json.json_view
2009-06-16 03:08:55 +00:00
def load_single_feed ( request ) :
user = get_user ( request )
offset = int ( request . REQUEST . get ( ' offset ' , 0 ) )
2010-04-27 12:02:20 -04:00
limit = int ( request . REQUEST . get ( ' limit ' , 30 ) )
2009-07-05 21:45:46 +00:00
page = int ( request . REQUEST . get ( ' page ' , 0 ) )
if page :
offset = limit * page
2009-06-16 03:08:55 +00:00
feed_id = request . REQUEST [ ' feed_id ' ]
feed = Feed . objects . get ( id = feed_id )
2009-08-01 04:26:57 +00:00
force_update = request . GET . get ( ' force_update ' , False )
2009-06-16 03:08:55 +00:00
2010-02-17 03:22:45 -05:00
stories = feed . get_stories ( offset , limit )
2009-07-05 21:45:46 +00:00
2009-06-16 03:08:55 +00:00
if force_update :
2009-08-01 04:26:57 +00:00
feed . update ( force_update )
2009-06-16 03:08:55 +00:00
2010-01-21 13:12:29 -05:00
# Get intelligence classifier for user
classifier_feeds = ClassifierFeed . objects . filter ( user = user , feed = feed )
classifier_authors = ClassifierAuthor . objects . filter ( user = user , feed = feed )
classifier_titles = ClassifierTitle . objects . filter ( user = user , feed = feed )
classifier_tags = ClassifierTag . objects . filter ( user = user , feed = feed )
2010-07-25 23:13:27 -04:00
try :
usersub = UserSubscription . objects . get ( user = user , feed = feed )
except UserSubscription . DoesNotExist :
print " ***> UserSub DNE, creating: %s %s " % ( user , feed )
usersub = UserSubscription . objects . create ( user = user , feed = feed )
2009-07-28 02:27:27 +00:00
# print "Feed: %s %s" % (feed, usersub)
logging . debug ( " Feed: " + feed . feed_title )
2010-05-12 18:55:54 -04:00
if stories :
last_read_date = stories [ - 1 ] [ ' story_date ' ]
else :
last_read_date = usersub . mark_read_date
2009-07-28 02:27:27 +00:00
userstory = UserStory . objects . filter (
user = user ,
2010-01-21 13:12:29 -05:00
feed = feed . id ,
2010-05-12 18:55:54 -04:00
read_date__gt = last_read_date
2009-07-28 02:27:27 +00:00
) . values ( )
for story in stories :
for o in userstory :
2009-09-08 04:27:27 +00:00
if o [ ' story_id ' ] == story . get ( ' id ' ) :
2009-07-28 02:27:27 +00:00
story [ ' opinion ' ] = o [ ' opinion ' ]
2009-08-01 04:26:57 +00:00
story [ ' read_status ' ] = ( o [ ' read_date ' ] is not None )
2009-07-28 02:27:27 +00:00
break
2009-09-08 04:27:27 +00:00
if not story . get ( ' read_status ' ) and story [ ' story_date ' ] < usersub . mark_read_date :
2009-07-28 02:27:27 +00:00
story [ ' read_status ' ] = 1
2009-09-08 04:27:27 +00:00
elif not story . get ( ' read_status ' ) and story [ ' story_date ' ] > usersub . last_read_date :
2009-07-28 02:27:27 +00:00
story [ ' read_status ' ] = 0
2010-01-21 13:12:29 -05:00
story [ ' intelligence ' ] = {
' feed ' : apply_classifier_feeds ( classifier_feeds , feed ) ,
' author ' : apply_classifier_authors ( classifier_authors , story ) ,
' tags ' : apply_classifier_tags ( classifier_tags , story ) ,
' title ' : apply_classifier_titles ( classifier_titles , story ) ,
}
2009-07-28 02:27:27 +00:00
# logging.debug("Story: %s" % story)
2009-06-16 03:08:55 +00:00
2010-01-21 13:12:29 -05:00
# Intelligence
2010-07-01 15:16:33 -04:00
feed_tags = json . decode ( feed . popular_tags ) if feed . popular_tags else [ ]
feed_authors = json . decode ( feed . popular_authors ) if feed . popular_authors else [ ]
2010-03-23 20:03:40 -04:00
classifiers = get_classifiers_for_user ( user , feed_id , classifier_feeds ,
classifier_authors , classifier_titles , classifier_tags )
2010-01-12 01:19:37 +00:00
2010-07-20 20:23:49 -04:00
usersub . feed_opens + = 1
usersub . save ( )
2010-07-26 21:38:56 -04:00
data = dict ( stories = stories ,
feed_tags = feed_tags ,
feed_authors = feed_authors ,
classifiers = classifiers )
2010-07-25 23:13:27 -04:00
return data
2009-06-16 03:08:55 +00:00
2009-08-13 03:26:12 +00:00
def load_feed_page ( request ) :
feed = Feed . objects . get ( id = request . REQUEST . get ( ' feed_id ' ) )
2010-06-27 22:40:22 -04:00
feed_page , created = FeedPage . objects . get_or_create ( feed = feed )
if not created :
2010-06-27 21:03:29 -04:00
data = feed . feed_page . page_data
2010-06-28 13:25:02 -04:00
if created or not data :
2010-06-27 21:03:29 -04:00
data = " Give it 5-10 minutes...<br /><br />Your feed will be here in under 5 minutes (on average).<br />Soon there will be a progress bar. Until then, take a deep breath. "
2009-08-13 03:26:12 +00:00
return HttpResponse ( data , mimetype = ' text/html ' )
2009-06-16 03:08:55 +00:00
2010-06-14 01:01:21 -04:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2010-06-14 01:01:21 -04:00
def mark_all_as_read ( request ) :
code = 1
days = int ( request . POST [ ' days ' ] )
feeds = UserSubscription . objects . filter ( user = request . user )
for sub in feeds :
if days == 0 :
sub . mark_feed_read ( )
else :
2010-06-30 17:17:07 -04:00
read_date = datetime . datetime . now ( ) - datetime . timedelta ( days = days )
if sub . mark_read_date < read_date :
sub . needs_unread_recalc = True
sub . mark_read_date = read_date
sub . save ( )
2010-06-14 01:01:21 -04:00
2010-07-21 11:04:21 -04:00
print " ---> Marking all as read [ %s ]: %s days " % ( request . user , days , )
2010-07-25 23:13:27 -04:00
return dict ( code = code )
2010-06-14 01:01:21 -04:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2009-06-16 03:08:55 +00:00
def mark_story_as_read ( request ) :
2010-02-17 03:22:45 -05:00
story_ids = request . REQUEST [ ' story_id ' ] . split ( ' , ' )
2009-08-29 19:34:42 +00:00
feed_id = int ( request . REQUEST [ ' feed_id ' ] )
2010-04-08 18:36:48 -04:00
usersub = UserSubscription . objects . get ( user = request . user , feed = feed_id )
if not usersub . needs_unread_recalc :
usersub . needs_unread_recalc = True
usersub . save ( )
2010-07-06 16:37:49 -04:00
2010-02-17 03:22:45 -05:00
data = dict ( code = 0 , payload = story_ids )
for story_id in story_ids :
logging . debug ( " Marked Read: %s ( %s ) " % ( story_id , feed_id ) )
m = UserStory ( story_id = int ( story_id ) , user = request . user , feed_id = feed_id )
try :
m . save ( )
data . update ( { ' code ' : 1 } )
2010-06-14 01:01:21 -04:00
except IntegrityError :
2010-02-17 03:22:45 -05:00
data . update ( { ' code ' : - 1 } )
2009-06-16 03:08:55 +00:00
2010-07-25 23:13:27 -04:00
return data
2009-06-16 03:08:55 +00:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2009-06-16 03:08:55 +00:00
def mark_feed_as_read ( request ) :
feed_id = int ( request . REQUEST [ ' feed_id ' ] )
feed = Feed . objects . get ( id = feed_id )
2009-09-08 04:37:38 +00:00
code = 0
2009-06-16 03:08:55 +00:00
us = UserSubscription . objects . get ( feed = feed , user = request . user )
try :
2009-09-08 04:37:38 +00:00
us . mark_feed_read ( )
2010-06-14 01:01:21 -04:00
except IntegrityError :
2009-09-08 04:37:38 +00:00
code = - 1
else :
code = 1
2010-07-21 11:04:21 -04:00
print " ---> Marking feed as read [ %s ]: %s " % ( request . user , feed , )
2009-09-08 04:37:38 +00:00
# UserStory.objects.filter(user=request.user, feed=feed_id).delete()
2010-07-25 23:13:27 -04:00
return dict ( code = code )
2009-06-16 03:08:55 +00:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2009-07-05 21:45:46 +00:00
def mark_story_as_like ( request ) :
return mark_story_with_opinion ( request , 1 )
2010-07-24 15:54:25 -04:00
@ajax_login_required
2009-07-05 21:45:46 +00:00
def mark_story_as_dislike ( request ) :
return mark_story_with_opinion ( request , - 1 )
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2009-07-05 21:45:46 +00:00
def mark_story_with_opinion ( request , opinion ) :
story_id = request . REQUEST [ ' story_id ' ]
story = Story . objects . select_related ( " story_feed " ) . get ( id = story_id )
2009-08-29 19:34:42 +00:00
previous_opinion = UserStory . objects . get ( story = story ,
2009-07-28 02:27:27 +00:00
user = request . user ,
feed = story . story_feed )
2009-07-05 21:45:46 +00:00
if previous_opinion and previous_opinion . opinion != opinion :
previous_opinion . opinion = opinion
2010-07-25 23:13:27 -04:00
code = 0
2009-07-05 21:45:46 +00:00
previous_opinion . save ( )
2009-07-19 16:55:08 +00:00
logging . debug ( " Changed Opinion: " + str ( previous_opinion . opinion ) + ' ' + str ( opinion ) )
2009-07-05 21:45:46 +00:00
else :
2009-07-19 16:55:08 +00:00
logging . debug ( " Marked Opinion: " + str ( story_id ) + ' ' + str ( opinion ) )
2009-08-29 19:34:42 +00:00
m = UserStory ( story = story , user = request . user , feed = story . story_feed , opinion = opinion )
2010-07-25 23:13:27 -04:00
code = 0
2009-07-05 21:45:46 +00:00
try :
m . save ( )
except :
2010-07-25 23:13:27 -04:00
code = 2
return dict ( code = code )
2009-07-05 21:45:46 +00:00
2009-06-16 03:08:55 +00:00
def _parse_user_info ( user ) :
return {
' user_info ' : {
2009-08-29 19:34:42 +00:00
' is_anonymous ' : json . encode ( user . is_anonymous ( ) ) ,
' is_authenticated ' : json . encode ( user . is_authenticated ( ) ) ,
' username ' : json . encode ( user . username if user . is_authenticated ( ) else ' Anonymous ' )
2009-06-16 03:08:55 +00:00
}
2009-06-22 15:28:20 +00:00
}
2010-03-28 17:06:19 -04:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2010-04-06 20:41:00 -04:00
def add_url ( request ) :
code = 0
url = request . POST [ ' url ' ]
folder = request . POST [ ' folder ' ]
feed = None
if url :
2010-07-27 22:11:23 -04:00
url = urlnorm . normalize ( url )
2010-04-06 20:41:00 -04:00
feed = Feed . objects . filter ( Q ( feed_address = url )
| Q ( feed_link__icontains = url ) )
if feed :
feed = feed [ 0 ]
else :
2010-07-21 11:38:33 -04:00
try :
feed = fetch_address_from_page ( url )
except :
code = - 2
message = " This feed has been added, but something went wrong " \
" when downloading it. Maybe the server ' s busy. "
2010-04-06 20:41:00 -04:00
if not feed :
code = - 1
2010-04-25 18:31:54 -04:00
message = " That URL does not point to a website or RSS feed. "
2010-04-06 20:41:00 -04:00
else :
2010-04-22 21:54:00 -04:00
us , _ = UserSubscription . objects . get_or_create (
feed = feed ,
user = request . user ,
defaults = { ' needs_unread_recalc ' : True }
)
2010-04-06 20:41:00 -04:00
code = 1
message = " "
2010-04-22 21:52:04 -04:00
user_sub_folders_object , created = UserSubscriptionFolders . objects . get_or_create ( user = request . user ,
defaults = { ' folders ' : ' [] ' }
)
if created :
user_sub_folders = [ ]
else :
user_sub_folders = json . decode ( user_sub_folders_object . folders )
2010-04-06 20:41:00 -04:00
user_sub_folders = _add_object_to_folder ( feed . pk , folder , user_sub_folders )
user_sub_folders_object . folders = json . encode ( user_sub_folders )
user_sub_folders_object . save ( )
2010-07-25 23:13:27 -04:00
return dict ( code = code , message = message )
2010-04-06 20:41:00 -04:00
def _add_object_to_folder ( obj , folder , folders ) :
if not folder :
folders . append ( obj )
return folders
for k , v in enumerate ( folders ) :
if isinstance ( v , dict ) :
for f_k , f_v in v . items ( ) :
if f_k == folder :
f_v . append ( obj )
folders [ k ] [ f_k ] = _add_object_to_folder ( obj , folder , f_v )
return folders
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2010-04-06 20:41:00 -04:00
def add_folder ( request ) :
folder = request . POST [ ' folder ' ]
parent_folder = request . POST [ ' parent_folder ' ]
if folder :
code = 1
message = " "
user_sub_folders_object , _ = UserSubscriptionFolders . objects . get_or_create ( user = request . user )
if user_sub_folders_object . folders :
user_sub_folders = json . decode ( user_sub_folders_object . folders )
else :
user_sub_folders = [ ]
obj = { folder : [ ] }
user_sub_folders = _add_object_to_folder ( obj , parent_folder , user_sub_folders )
user_sub_folders_object . folders = json . encode ( user_sub_folders )
user_sub_folders_object . save ( )
else :
code = - 1
message = " Gotta write in a folder name. "
2010-07-25 23:13:27 -04:00
return dict ( code = code , message = message )
2010-04-06 20:41:00 -04:00
2010-07-24 15:54:25 -04:00
@ajax_login_required
2010-07-25 23:13:27 -04:00
@json.json_view
2010-03-28 17:06:19 -04:00
def delete_feed ( request ) :
feed_id = int ( request . POST [ ' feed_id ' ] )
user_sub = get_object_or_404 ( UserSubscription , user = request . user , feed = feed_id )
2010-03-28 17:45:54 -04:00
user_sub . delete ( )
2010-03-28 17:06:19 -04:00
user_stories = UserStory . objects . filter ( user = request . user , feed = feed_id )
2010-03-28 17:45:54 -04:00
user_stories . delete ( )
2010-03-28 17:06:19 -04:00
2010-05-04 10:39:25 -04:00
def _find_feed_in_folders ( old_folders ) :
new_folders = [ ]
for k , folder in enumerate ( old_folders ) :
2010-03-28 17:06:19 -04:00
if isinstance ( folder , int ) :
if folder == feed_id :
2010-05-04 10:39:25 -04:00
print " DEL ' ED: %s ' th item: %s " % ( k , old_folders )
# folders.remove(folder)
else :
new_folders . append ( folder )
2010-03-28 17:06:19 -04:00
elif isinstance ( folder , dict ) :
for f_k , f_v in folder . items ( ) :
2010-05-04 10:39:25 -04:00
new_folders . append ( { f_k : _find_feed_in_folders ( f_v ) } )
return new_folders
2010-03-28 17:06:19 -04:00
user_sub_folders_object = UserSubscriptionFolders . objects . get ( user = request . user )
user_sub_folders = json . decode ( user_sub_folders_object . folders )
user_sub_folders = _find_feed_in_folders ( user_sub_folders )
user_sub_folders_object . folders = json . encode ( user_sub_folders )
2010-03-28 17:45:54 -04:00
user_sub_folders_object . save ( )
2010-03-28 17:06:19 -04:00
2010-07-25 23:13:27 -04:00
return dict ( code = 1 )
2010-06-12 21:20:06 -04:00
@login_required
def add_feature ( request ) :
if not request . user . is_staff :
return HttpResponseForbidden ( )
code = - 1
form = FeatureForm ( request . POST )
if form . is_valid ( ) :
form . save ( )
code = 1
return HttpResponseRedirect ( reverse ( ' index ' ) )
2010-07-25 23:13:27 -04:00
return dict ( code = code )
2010-06-30 12:17:22 -04:00
2010-07-25 23:13:27 -04:00
@json.json_view
2010-06-30 12:17:22 -04:00
def load_features ( request ) :
2010-06-30 16:18:55 -04:00
page = int ( request . POST . get ( ' page ' , 0 ) )
features = Feature . objects . all ( ) [ page * 3 : ( page + 1 ) * 3 + 1 ] . values ( )
2010-07-31 00:13:27 -04:00
features = [ { ' description ' : f [ ' description ' ] , ' date ' : f [ ' date ' ] . strftime ( " % b %d , % Y " ) } for f in features ]
2010-07-25 23:13:27 -04:00
return features
2010-07-11 11:10:45 -04:00
@json.json_view
def save_feed_order ( request ) :
folders = request . POST . get ( ' folders ' )
print " ---> [ %s ]: Feed re-ordering: %s " % ( request . user , folders )
if folders :
# Test that folders can be JSON decoded
folders_list = json . decode ( folders )
2010-07-20 20:23:49 -04:00
assert folders_list is not None
2010-07-11 11:10:45 -04:00
user_sub_folders = UserSubscriptionFolders . objects . get ( user = request . user )
user_sub_folders . folders = folders
user_sub_folders . save ( )
2010-07-20 23:59:56 -04:00
return { }
@login_required
def login_as ( request ) :
if not request . user . is_staff :
assert False
return HttpResponseForbidden ( )
username = request . GET [ ' user ' ]
user = get_object_or_404 ( User , username = username )
user . backend = settings . AUTHENTICATION_BACKENDS [ 0 ]
login_user ( request , user )
return HttpResponseRedirect ( reverse ( ' index ' ) )