resolve conflict
parent
fabc7e6802
commit
6cf42b1a67
|
@ -1,71 +1,80 @@
|
||||||
|
'''
|
||||||
|
imports not from django or regluit
|
||||||
|
'''
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
from datetime import timedelta, date
|
|
||||||
from regluit.utils.localdatetime import now, date_today
|
|
||||||
|
|
||||||
from random import randint
|
|
||||||
from re import sub
|
|
||||||
from itertools import islice
|
|
||||||
from decimal import Decimal as D
|
|
||||||
from xml.etree import ElementTree as ET
|
|
||||||
import requests
|
import requests
|
||||||
import oauth2 as oauth
|
import oauth2 as oauth
|
||||||
|
|
||||||
|
from datetime import timedelta, date
|
||||||
|
from decimal import Decimal as D
|
||||||
|
from itertools import islice, chain
|
||||||
|
from notification import models as notification
|
||||||
|
from random import randint
|
||||||
|
from re import sub
|
||||||
|
from xml.etree import ElementTree as ET
|
||||||
|
from tastypie.models import ApiKey
|
||||||
|
|
||||||
|
'''
|
||||||
|
django imports
|
||||||
|
'''
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core import signing
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.views import login
|
from django.contrib.auth.views import login
|
||||||
from django.contrib.comments import Comment
|
from django.contrib.comments import Comment
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
|
from django.core import signing
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from django.db.models import Q, Count, Sum
|
from django.db.models import Q, Count, Sum
|
||||||
from django.forms import Select
|
from django.forms import Select
|
||||||
from django.forms.models import modelformset_factory
|
from django.forms.models import modelformset_factory
|
||||||
from django.http import HttpResponseRedirect, Http404
|
from django.http import HttpResponseRedirect, Http404
|
||||||
from django.http import HttpResponse, HttpResponseNotFound
|
from django.http import HttpResponse, HttpResponseNotFound
|
||||||
|
from django.shortcuts import render, render_to_response, get_object_or_404
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
from django.utils.http import urlencode
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from django.views.decorators.http import require_POST
|
from django.views.decorators.http import require_POST
|
||||||
from django.views.generic.edit import FormView
|
from django.views.generic.edit import FormView
|
||||||
from django.views.generic.list import ListView
|
from django.views.generic.list import ListView
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
from django.shortcuts import render, render_to_response, get_object_or_404
|
|
||||||
from django.utils.http import urlencode
|
'''
|
||||||
from django.utils.translation import ugettext_lazy as _
|
regluit imports
|
||||||
|
'''
|
||||||
from regluit.core import tasks
|
from regluit.core import tasks
|
||||||
from regluit.core.tasks import send_mail_task, emit_notifications
|
|
||||||
from regluit.core import models, bookloader, librarything
|
from regluit.core import models, bookloader, librarything
|
||||||
from regluit.core import userlists
|
from regluit.core import userlists
|
||||||
from regluit.core.search import gluejar_search
|
|
||||||
from regluit.core import goodreads
|
from regluit.core import goodreads
|
||||||
from regluit.core.goodreads import GoodreadsClient
|
|
||||||
from regluit.core.bookloader import merge_works
|
from regluit.core.bookloader import merge_works
|
||||||
|
from regluit.core.goodreads import GoodreadsClient
|
||||||
|
from regluit.core.search import gluejar_search
|
||||||
from regluit.core.signals import supporter_message
|
from regluit.core.signals import supporter_message
|
||||||
|
|
||||||
from regluit.frontend.forms import UserData, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm
|
from regluit.frontend.forms import UserData, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm
|
||||||
from regluit.frontend.forms import RightsHolderForm, UserClaimForm, LibraryThingForm, OpenCampaignForm
|
from regluit.frontend.forms import RightsHolderForm, UserClaimForm, LibraryThingForm, OpenCampaignForm
|
||||||
from regluit.frontend.forms import getManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm, FeedbackForm
|
from regluit.frontend.forms import getManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm, FeedbackForm
|
||||||
from regluit.frontend.forms import EbookForm, CustomPremiumForm, EditManagersForm, EditionForm, PledgeCancelForm
|
from regluit.frontend.forms import EbookForm, CustomPremiumForm, EditManagersForm, EditionForm, PledgeCancelForm
|
||||||
from regluit.frontend.forms import getTransferCreditForm, CCForm, CloneCampaignForm, PlainCCForm, WorkForm, OtherWorkForm
|
from regluit.frontend.forms import getTransferCreditForm, CCForm, CloneCampaignForm, PlainCCForm, WorkForm, OtherWorkForm
|
||||||
from regluit.frontend.forms import MsgForm, AuthForm
|
from regluit.frontend.forms import MsgForm, AuthForm
|
||||||
|
|
||||||
|
from regluit.payment import baseprocessor, stripelib
|
||||||
|
from regluit.payment.credit import credit_transaction
|
||||||
from regluit.payment.manager import PaymentManager
|
from regluit.payment.manager import PaymentManager
|
||||||
from regluit.payment.models import Transaction, Account
|
from regluit.payment.models import Transaction, Account, Sent, CreditLog
|
||||||
from regluit.payment import baseprocessor
|
|
||||||
from regluit.payment.parameters import TRANSACTION_STATUS_ACTIVE, TRANSACTION_STATUS_COMPLETE, TRANSACTION_STATUS_CANCELED, TRANSACTION_STATUS_ERROR, TRANSACTION_STATUS_FAILED, TRANSACTION_STATUS_INCOMPLETE, TRANSACTION_STATUS_NONE, TRANSACTION_STATUS_MODIFIED
|
from regluit.payment.parameters import TRANSACTION_STATUS_ACTIVE, TRANSACTION_STATUS_COMPLETE, TRANSACTION_STATUS_CANCELED, TRANSACTION_STATUS_ERROR, TRANSACTION_STATUS_FAILED, TRANSACTION_STATUS_INCOMPLETE, TRANSACTION_STATUS_NONE, TRANSACTION_STATUS_MODIFIED
|
||||||
from regluit.payment.parameters import PAYMENT_TYPE_AUTHORIZATION, PAYMENT_TYPE_INSTANT
|
from regluit.payment.parameters import PAYMENT_TYPE_AUTHORIZATION, PAYMENT_TYPE_INSTANT
|
||||||
from regluit.payment.parameters import PAYMENT_HOST_STRIPE, PAYMENT_HOST_NONE
|
from regluit.payment.parameters import PAYMENT_HOST_STRIPE, PAYMENT_HOST_NONE
|
||||||
from regluit.payment.credit import credit_transaction
|
|
||||||
from tastypie.models import ApiKey
|
|
||||||
from regluit.payment.models import Transaction, Sent, CreditLog
|
|
||||||
from notification import models as notification
|
|
||||||
|
|
||||||
from regluit.payment import stripelib
|
from regluit.utils.localdatetime import now, date_today
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -129,13 +138,70 @@ def home(request, landing=False):
|
||||||
if request.user.is_authenticated() and landing == False:
|
if request.user.is_authenticated() and landing == False:
|
||||||
return HttpResponseRedirect(reverse('supporter',
|
return HttpResponseRedirect(reverse('supporter',
|
||||||
args=[request.user.username]))
|
args=[request.user.username]))
|
||||||
|
|
||||||
|
"""
|
||||||
|
use campaigns instead of works so that we can order by amount left,
|
||||||
|
drive interest toward most-nearly-successful
|
||||||
|
"""
|
||||||
|
top_campaigns = models.Campaign.objects.filter(status="ACTIVE").order_by('left')[:4]
|
||||||
|
|
||||||
|
most_wished = models.Work.objects.order_by('-num_wishes')[:4]
|
||||||
|
|
||||||
|
unglued_books = models.Work.objects.filter(campaigns__status="SUCCESSFUL").order_by('-campaigns__deadline')
|
||||||
|
|
||||||
worklist = slideshow(12)
|
"""
|
||||||
works = worklist[:6]
|
get various recent types of site activity
|
||||||
works2 = worklist[6:12]
|
"""
|
||||||
|
latest_comments = Comment.objects.order_by(
|
||||||
|
'-submit_date'
|
||||||
|
)[:10]
|
||||||
|
latest_pledges = Transaction.objects.filter(
|
||||||
|
anonymous=False
|
||||||
|
).only(
|
||||||
|
'date_created', 'user', 'campaign'
|
||||||
|
).order_by(
|
||||||
|
'-date_created'
|
||||||
|
)[:10]
|
||||||
|
latest_wishes = models.Wishes.objects.order_by(
|
||||||
|
'-created'
|
||||||
|
)[:10]
|
||||||
|
|
||||||
events = models.Wishes.objects.order_by('-created')[0:2]
|
"""
|
||||||
return render(request, 'home.html', {'suppress_search_box': True, 'works': works, 'works2': works2, 'events': events})
|
for each event, we'll be passing its object and type to the template
|
||||||
|
(and preserving its date for sorting purposes)
|
||||||
|
"""
|
||||||
|
latest_comments_tuple = map(
|
||||||
|
lambda x: (x.submit_date, x, 'comment'),
|
||||||
|
latest_comments
|
||||||
|
)
|
||||||
|
|
||||||
|
latest_pledges_tuple = map(
|
||||||
|
lambda x: (x.date_created, x, 'pledge'),
|
||||||
|
latest_pledges
|
||||||
|
)
|
||||||
|
|
||||||
|
latest_wishes_tuple = map(
|
||||||
|
lambda x: (x.created, x, 'wish'),
|
||||||
|
latest_wishes
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
|
merge latest actions into a single list, sorted by date, to loop through in template
|
||||||
|
"""
|
||||||
|
latest_actions = sorted(
|
||||||
|
chain(latest_comments_tuple, latest_pledges_tuple, latest_wishes_tuple),
|
||||||
|
key=lambda instance: instance[0],
|
||||||
|
reverse=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if request.user.is_authenticated():
|
||||||
|
events = latest_actions[:12]
|
||||||
|
else:
|
||||||
|
events = latest_actions[:6]
|
||||||
|
|
||||||
|
return render(request, 'home.html', {
|
||||||
|
'suppress_search_box': True, 'events': events, 'top_campaigns': top_campaigns, 'unglued_books': unglued_books, 'most_wished': most_wished
|
||||||
|
})
|
||||||
|
|
||||||
def stub(request):
|
def stub(request):
|
||||||
path = request.path[6:] # get rid of /stub/
|
path = request.path[6:] # get rid of /stub/
|
||||||
|
@ -153,6 +219,8 @@ def superlogin(request, **kwargs):
|
||||||
extra_context={"socials":user.profile.social_auths}
|
extra_context={"socials":user.profile.social_auths}
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
if request.GET.has_key("add"):
|
||||||
|
request.session["add_wishlist"]=request.GET["add"]
|
||||||
return login(request, extra_context=extra_context, authentication_form=AuthForm, **kwargs)
|
return login(request, extra_context=extra_context, authentication_form=AuthForm, **kwargs)
|
||||||
|
|
||||||
def work(request, work_id, action='display'):
|
def work(request, work_id, action='display'):
|
||||||
|
@ -160,6 +228,13 @@ def work(request, work_id, action='display'):
|
||||||
if action == "acks":
|
if action == "acks":
|
||||||
return acks( request, work)
|
return acks( request, work)
|
||||||
|
|
||||||
|
# process waiting add request
|
||||||
|
if not request.user.is_anonymous() and request.session.has_key("add_wishlist"):
|
||||||
|
add_url = request.session["add_wishlist"]
|
||||||
|
if add_url == request.path:
|
||||||
|
request.user.wishlist.add_work(work, "login", notify=True)
|
||||||
|
request.session.pop("add_wishlist")
|
||||||
|
|
||||||
if request.method == 'POST' and not request.user.is_anonymous():
|
if request.method == 'POST' and not request.user.is_anonymous():
|
||||||
activetab = '4'
|
activetab = '4'
|
||||||
else:
|
else:
|
||||||
|
@ -448,6 +523,14 @@ def googlebooks(request, googlebooks_id):
|
||||||
if not edition:
|
if not edition:
|
||||||
return HttpResponseNotFound("invalid googlebooks id")
|
return HttpResponseNotFound("invalid googlebooks id")
|
||||||
work_url = reverse('work', kwargs={'work_id': edition.work.id})
|
work_url = reverse('work', kwargs={'work_id': edition.work.id})
|
||||||
|
|
||||||
|
# process waiting add request
|
||||||
|
if not request.user.is_anonymous() and request.session.has_key("add_wishlist"):
|
||||||
|
add_url = request.session["add_wishlist"]
|
||||||
|
if add_url == request.path:
|
||||||
|
request.user.wishlist.add_work(edition.work, "login", notify=True)
|
||||||
|
request.session.pop("add_wishlist")
|
||||||
|
|
||||||
return HttpResponseRedirect(work_url)
|
return HttpResponseRedirect(work_url)
|
||||||
|
|
||||||
def subjects(request):
|
def subjects(request):
|
||||||
|
@ -521,15 +604,28 @@ class WorkListView(FilterableListView):
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
class ByPubListView(WorkListView):
|
class ByPubView(WorkListView):
|
||||||
template_name = "bypub_list.html"
|
template_name = "bypub_list.html"
|
||||||
context_object_name = "work_list"
|
context_object_name = "work_list"
|
||||||
max_works=100000
|
max_works = 100000
|
||||||
|
publisher_name = None
|
||||||
|
publisher = None
|
||||||
|
|
||||||
|
def get_publisher_name(self):
|
||||||
|
self.publisher_name = get_object_or_404(models.PublisherName, id=self.kwargs['pubname'])
|
||||||
|
self.set_publisher()
|
||||||
|
|
||||||
|
def set_publisher(self):
|
||||||
|
if self.publisher_name.key_publisher.count():
|
||||||
|
self.publisher = self.publisher_name.key_publisher.all()[0]
|
||||||
|
elif self.publisher_name.publisher:
|
||||||
|
self.publisher = self.publisher_name.publisher
|
||||||
|
self.publisher_name = self.publisher.name
|
||||||
|
|
||||||
def get_queryset_all(self):
|
def get_queryset_all(self):
|
||||||
facet = self.kwargs.get('facet','')
|
facet = self.kwargs.get('facet','')
|
||||||
pubname = self.kwargs['pubname']
|
self.get_publisher_name()
|
||||||
objects = models.Work.objects.filter(editions__publisher__iexact=pubname).distinct()
|
objects = models.Work.objects.filter(editions__publisher_name__id=self.publisher_name.id).distinct()
|
||||||
if (facet == 'popular'):
|
if (facet == 'popular'):
|
||||||
return objects.order_by('-num_wishes', 'id')
|
return objects.order_by('-num_wishes', 'id')
|
||||||
elif (facet == 'pubdate'):
|
elif (facet == 'pubdate'):
|
||||||
|
@ -540,10 +636,17 @@ class ByPubListView(WorkListView):
|
||||||
return objects.order_by('title', 'id')
|
return objects.order_by('title', 'id')
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(ByPubListView, self).get_context_data(**kwargs)
|
context = super(ByPubView, self).get_context_data(**kwargs)
|
||||||
context['pubname'] = self.kwargs['pubname']
|
context['pubname'] = self.publisher_name
|
||||||
|
context['publisher'] = self.publisher
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
class ByPubListView(ByPubView):
|
||||||
|
def get_publisher_name(self):
|
||||||
|
self.publisher_name = get_object_or_404(models.PublisherName, name=self.kwargs['pubname'])
|
||||||
|
self.set_publisher()
|
||||||
|
|
||||||
|
|
||||||
class UngluedListView(FilterableListView):
|
class UngluedListView(FilterableListView):
|
||||||
template_name = "unglued_list.html"
|
template_name = "unglued_list.html"
|
||||||
context_object_name = "work_list"
|
context_object_name = "work_list"
|
||||||
|
@ -1554,11 +1657,11 @@ class ManageAccount(FormView):
|
||||||
return render(self.request, self.template_name, self.get_context_data())
|
return render(self.request, self.template_name, self.get_context_data())
|
||||||
|
|
||||||
def search(request):
|
def search(request):
|
||||||
q = request.GET.get('q', None)
|
q = request.GET.get('q', '')
|
||||||
page = int(request.GET.get('page', 1))
|
page = int(request.GET.get('page', 1))
|
||||||
results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=page)
|
results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=page)
|
||||||
|
|
||||||
if page==1:
|
if q != '' and page==1:
|
||||||
work_query = Q(title__icontains=q) | Q(editions__authors__name__icontains=q) | Q(subjects__name__iexact=q)
|
work_query = Q(title__icontains=q) | Q(editions__authors__name__icontains=q) | Q(subjects__name__iexact=q)
|
||||||
campaign_works = models.Work.objects.exclude(campaigns = None).filter(work_query).distinct()
|
campaign_works = models.Work.objects.exclude(campaigns = None).filter(work_query).distinct()
|
||||||
else:
|
else:
|
||||||
|
@ -2097,45 +2200,49 @@ def emailshare(request, action):
|
||||||
|
|
||||||
return render(request, "emailshare.html", {'form':form})
|
return render(request, "emailshare.html", {'form':form})
|
||||||
|
|
||||||
def feedback(request):
|
def ask_rh(request, campaign_id):
|
||||||
num1 = randint(0,10)
|
campaign = get_object_or_404(models.Campaign, id=campaign_id)
|
||||||
num2 = randint(0,10)
|
return feedback(request, recipient=campaign.email, template="ask_rh.html",
|
||||||
sum = num1 + num2
|
message_template="ask_rh.txt",
|
||||||
|
redirect_url = reverse('work', args=[campaign.work.id]),
|
||||||
|
extra_context={'campaign':campaign, 'subject':campaign })
|
||||||
|
|
||||||
|
def feedback(request, recipient='support@gluejar.com', template='feedback.html', message_template='feedback.txt', extra_context=None, redirect_url=None):
|
||||||
|
context = extra_context or {}
|
||||||
|
context['num1'] = randint(0,10)
|
||||||
|
context['num2'] = randint(0,10)
|
||||||
|
context['answer'] = context['num1'] + context['num2']
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form=FeedbackForm(request.POST)
|
form=FeedbackForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
subject = form.cleaned_data['subject']
|
context.update(form.cleaned_data)
|
||||||
message = form.cleaned_data['message']
|
context['request']=request
|
||||||
sender = form.cleaned_data['sender']
|
if extra_context:
|
||||||
recipient = 'support@gluejar.com'
|
context.update(extra_context)
|
||||||
page = form.cleaned_data['page']
|
message = render_to_string(message_template,context)
|
||||||
useragent = request.META['HTTP_USER_AGENT']
|
send_mail_task.delay(context['subject'], message, context['sender'], [recipient])
|
||||||
if request.user.is_anonymous():
|
if redirect_url:
|
||||||
ungluer = "(not logged in)"
|
return HttpResponseRedirect(redirect_url)
|
||||||
else:
|
else:
|
||||||
ungluer = request.user.username
|
return render(request, "thanks.html", context)
|
||||||
message = "<<<This feedback is about "+page+". Original user message follows\nfrom "+sender+", ungluer name "+ungluer+"\nwith user agent "+useragent+"\n>>>\n"+message
|
|
||||||
send_mail_task.delay(subject, message, sender, [recipient])
|
|
||||||
|
|
||||||
return render(request, "thanks.html", {"page":page})
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
num1 = request.POST['num1']
|
context['num1'] = request.POST['num1']
|
||||||
num2 = request.POST['num2']
|
context['num2'] = request.POST['num2']
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if request.user.is_authenticated():
|
if request.user.is_authenticated():
|
||||||
sender=request.user.email;
|
context['sender']=request.user.email;
|
||||||
else:
|
|
||||||
sender=''
|
|
||||||
try:
|
try:
|
||||||
page = request.GET['page']
|
context['page'] = request.GET['page']
|
||||||
except:
|
except:
|
||||||
page='/'
|
context['page'] = '/'
|
||||||
form = FeedbackForm(initial={"sender":sender, "subject": "Feedback on page "+page, "page":page, "num1":num1, "num2":num2, "answer":sum})
|
if not context.has_key('subject'):
|
||||||
|
context['subject'] = "Feedback on page "+context['page']
|
||||||
return render(request, "feedback.html", {'form':form, 'num1':num1, 'num2':num2})
|
form = FeedbackForm(initial=context)
|
||||||
|
context['form'] = form
|
||||||
|
return render(request, template, context)
|
||||||
|
|
||||||
def comment(request):
|
def comment(request):
|
||||||
latest_comments = Comment.objects.all().order_by('-submit_date')[:20]
|
latest_comments = Comment.objects.all().order_by('-submit_date')[:20]
|
||||||
|
|
Loading…
Reference in New Issue