summaryrefslogtreecommitdiff
path: root/tbc/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'tbc/views.py')
-rwxr-xr-xtbc/views.py497
1 files changed, 459 insertions, 38 deletions
diff --git a/tbc/views.py b/tbc/views.py
index 749c57d..0f23439 100755
--- a/tbc/views.py
+++ b/tbc/views.py
@@ -1,7 +1,11 @@
+from django.utils.encoding import force_text
+from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, redirect
+from django.views.decorators.csrf import csrf_exempt
from django.core.context_processors import csrf
from django.contrib.auth import authenticate, login, logout
+from django.contrib.admin.models import CHANGE
from models import *
from tbc.forms import *
import os
@@ -11,9 +15,24 @@ import smtplib
import shutil
import string
import random
+import json
from email.mime.text import MIMEText
+def add_log(user, object, flag, message, proposal_id=None, chat='No message'):
+ '''Creates log entry of the user activities.'''
+ ActivityLog(
+ user_id=user.id,
+ content_type_id=ContentType.objects.get_for_model(object).id,
+ object_id=object.id,
+ object_repr=force_text(object),
+ action_flag=flag,
+ change_message=message,
+ proposal_id = proposal_id,
+ conversation = chat,
+ ).save()
+
+
def email_send(to,subject,msg):
try:
smtpObj = smtplib.SMTP('localhost')
@@ -25,7 +44,7 @@ def email_send(to,subject,msg):
smtpObj.sendmail(mail_from, to, message.as_string())
except SMTPException:
return HttpResponse("Error:unable to send email")
-
+
def is_reviewer(user):
if user.groups.filter(name='reviewer').count() == 1:
@@ -62,11 +81,6 @@ def AboutPytbc(request):
return render_to_response('tbc/about-pytbc.html', context)
-def TemporarilyUnavailable(request):
- context = {}
- return render_to_response('tbc/unavailable.html', context)
-
-
def Home(request):
context = {}
images = []
@@ -89,6 +103,17 @@ def Home(request):
context['update_book'] = True
if 'not_found' in request.GET:
context['not_found'] = True
+ if 'proposal' in request.GET:
+ context['proposal_submitted'] = True
+ if 'proposal_pending' in request.GET:
+ context['proposal_pending'] = True
+ if 'no_book_alloted' in request.GET:
+ context['no_book_alloted'] = True
+ if 'sample_notebook' in request.GET:
+ context['sample_notebook'] = True
+ if 'cannot_submit_sample' in request.GET:
+ context['cannot_submit_sample'] =True
+
books = Book.objects.filter(approved=True).order_by("-id")[0:6]
for book in books:
images.append(ScreenShots.objects.filter(book=book)[0])
@@ -99,7 +124,7 @@ def Home(request):
book_images.append(obj)
context['items'] = book_images
return render_to_response('base.html', context)
-
+
def UserLogin(request):
context = {}
@@ -118,6 +143,7 @@ def UserLogin(request):
curr_user = authenticate(username=username, password=password)
if curr_user is not None:
login(request, curr_user)
+ add_log(curr_user, curr_user, CHANGE, 'Logged in')
else:
form = UserLoginForm()
context['form'] = form
@@ -146,7 +172,8 @@ def UserRegister(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
- form.save()
+ user = form.save()
+ add_log(user, user, CHANGE, 'Registered')
return HttpResponseRedirect('/login/?signup=done')
else:
context = {}
@@ -165,11 +192,16 @@ def UserProfile(request):
user = request.user
if user.is_authenticated():
if request.method == 'POST':
- form = UserProfileForm(request.POST)
+ user_profile = Profile.objects.filter(user=user)
+ if user_profile.exists():
+ form = UserProfileForm(request.POST, instance=user_profile[0])
+ else:
+ form = UserProfileForm(request.POST)
if form.is_valid():
data = form.save(commit=False)
data.user = request.user
data.save()
+ add_log(user, user, CHANGE,'Profile entry')
return HttpResponseRedirect('/')
else:
context.update(csrf(request))
@@ -185,12 +217,13 @@ def UserProfile(request):
return render_to_response('tbc/profile.html', context)
else:
return HttpResponseRedirect('/login/?require_login=True')
-
+
def UserLogout(request):
user = request.user
if user.is_authenticated() and user.is_active:
logout(request)
+ add_log(user, user, CHANGE, 'Logged out')
return redirect('/?logout=done')
@@ -226,7 +259,7 @@ def ForgotPassword(request):
return render_to_response("tbc/login.html", context)
else:
context['invalid_email'] = True
- return render_to_response("tbc/forgot-password.html", context)
+ return render_to_response("tbc/forgot-password.html", context)
else:
return render_to_response("tbc/forgot-password.html", context)
@@ -247,6 +280,7 @@ def UpdatePassword(request):
if new_password == confirm:
user.set_password(new_password)
user.save()
+ add_log(user, user, CHANGE, 'Password updated')
form = UserLoginForm()
context['password_updated'] = True
context['form'] = form
@@ -266,7 +300,7 @@ def UpdatePassword(request):
context['form'] = form
context['require_login'] = True
return render_to_response("tbc/login.html", context)
-
+
def SubmitBook(request):
context = {}
@@ -282,6 +316,8 @@ def SubmitBook(request):
context['user'] = curr_user
curr_book = Book.objects.order_by("-id")[0]
curr_book_id = curr_book.id
+ proposal_id = Proposal.objects.get(accepted=curr_book)
+ add_log(curr_user, curr_book, CHANGE, 'Book submitted', proposal_id)
return HttpResponseRedirect('/upload-content/'+str(curr_book_id))
else:
context.update(csrf(request))
@@ -294,33 +330,339 @@ def SubmitBook(request):
context['form'] = form
context['user'] = curr_user
return render_to_response('tbc/submit-book.html', context)
-
-def UpdateBook(request):
+
+def SubmitProposal(request):
+ curr_user = request.user
+ user_profile = Profile.objects.get(user=curr_user.id)
+ context = {}
+ context.update(csrf(request))
+ context['user'] = curr_user
+ user_proposals = list(Proposal.objects.filter(user=user_profile))
+ proposal_id = None
+ can_submit_new = True
+ matching_books = []
+ for proposal in user_proposals:
+ if proposal.status != 'book completed':
+ can_submit_new = False
+ if proposal.status == 'rejected':
+ can_submit_new = True
+ proposal_id = proposal.id
+
+ if can_submit_new:
+ if request.method == 'POST':
+ try:
+ proposal = Proposal.objects.get(id=proposal_id)
+ except:
+ proposal = Proposal()
+ proposal.user = user_profile
+ proposal.status = 'Pending'
+ proposal.save()
+ book_titles = request.POST.getlist('title')
+ book_authors = request.POST.getlist('author')
+ book_categories = request.POST.getlist('category')
+ book_pubs = request.POST.getlist('publisher_place')
+ book_isbns = request.POST.getlist('isbn')
+ book_editions = request.POST.getlist('edition')
+ book_years = request.POST.getlist('year_of_pub')
+ book_chapters = request.POST.getlist('no_chapters')
+ textbooks = proposal.textbooks.all()
+ textbooks.delete()
+ for item in range(3):
+ tempbook = TempBook(no_chapters=0)
+ tempbook.title = book_titles[item]
+ tempbook.author = book_authors[item]
+ tempbook.category = book_categories[item]
+ tempbook.publisher_place = book_pubs[item]
+ tempbook.isbn = book_isbns[item]
+ tempbook.edition = book_editions[item]
+ tempbook.year_of_pub = book_years[item]
+ tempbook.save()
+ proposal.textbooks.add(tempbook)
+ add_log(curr_user, proposal, CHANGE, 'Proposed Books', proposal.id)
+ return HttpResponseRedirect('/?proposal=submitted')
+ else:
+ book_forms = []
+ for i in range(3):
+ form = BookForm()
+ if proposal_id:
+ proposal = Proposal.objects.get(id=proposal_id)
+ textbooks = proposal.textbooks.all()
+ if len(textbooks) == 3:
+ form.initial['title'] = textbooks[i].title
+ form.initial['author'] = textbooks[i].author
+ form.initial['category'] = textbooks[i].category
+ form.initial['publisher_place'] = textbooks[i].publisher_place
+ form.initial['isbn'] = textbooks[i].isbn
+ form.initial['edition'] = textbooks[i].edition
+ form.initial['year_of_pub'] = textbooks[i].year_of_pub
+ form.initial['no_chapters'] = textbooks[i].no_chapters
+
+ book_forms.append(form)
+ context['book_forms'] = book_forms
+ return render_to_response('tbc/submit-proposal.html', context)
+ else:
+ return HttpResponseRedirect('/?proposal_pending=True')
+
+
+def ListAICTE(request):
+ curr_user = request.user
+ user_profile = Profile.objects.get(user=curr_user.id)
+ user_proposals = Proposal.objects.filter(user=user_profile)
+ context = {}
+ context.update(csrf(request))
+ context['user'] = curr_user
+ aicte_books = AicteBook.objects.filter(proposed=0)
+ context['aicte_books'] = aicte_books
+ return render_to_response('tbc/aicte-books.html', context)
+
+
+def SubmitAICTEProposal(request, aicte_book_id=None):
+ curr_user = request.user
+ user_profile = Profile.objects.get(user=curr_user.id)
+ context = {}
+ context.update(csrf(request))
+ context['user'] = curr_user
+ user_proposals = Proposal.objects.filter(user=user_profile)
+ book_proposed = AicteBook.objects.get(id=aicte_book_id)
+ context['aicte_book'] = book_proposed
+ can_submit_new = True
+ proposal_id = None
+ for proposal in user_proposals:
+ if proposal.status != "book completed":
+ can_submit_new = False
+ if proposal.status == 'rejected':
+ can_submit_new = True
+ proposal_id = proposal.id
+ if can_submit_new:
+ if request.method == 'POST':
+ book_proposed.title = request.POST['title']
+ book_proposed.author = request.POST['author']
+ book_proposed.category = request.POST['category']
+ book_proposed.publisher_place = request.POST['publisher_place']
+ book_proposed.isbn = request.POST['isbn']
+ book_proposed.edition = request.POST['edition']
+ book_proposed.year_of_pub = request.POST['year_of_pub']
+ book_proposed.proposed = True
+ book_proposed.save()
+ try:
+ proposal = Proposal.objects.get(id=proposal_id)
+ except:
+ proposal = Proposal()
+ proposal.user = user_profile
+ proposal.status = 'Pending'
+ proposal.save()
+ textbooks = proposal.textbooks.all()
+ if textbooks:
+ textbooks.delete()
+ tempbook = TempBook(no_chapters=0)
+ tempbook.title = book_proposed.title
+ tempbook.author = book_proposed.author
+ tempbook.category = book_proposed.category
+ tempbook.publisher_place = book_proposed.publisher_place
+ tempbook.isbn = book_proposed.isbn
+ tempbook.edition = book_proposed.edition
+ tempbook.year_of_pub = book_proposed.year_of_pub
+ tempbook.save()
+ proposal.textbooks.add(tempbook)
+ print proposal.textbooks.all()
+ add_log(curr_user, proposal, CHANGE, 'AICTE proposal' ,proposal.id)
+ return HttpResponseRedirect('/?proposal=submitted')
+ else:
+ book_form = BookForm()
+ book_form.initial['title'] = book_proposed.title
+ book_form.initial['author'] = book_proposed.author
+ book_form.initial['publisher_place'] = book_proposed.publisher_place
+ book_form.initial['category'] = book_proposed.category
+ book_form.initial['isbn'] = book_proposed.isbn
+ book_form.initial['edition'] = book_proposed.edition
+ book_form.initial['year_of_pub'] = book_proposed.year_of_pub
+ context['form'] = book_form
+ return render_to_response('tbc/confirm-aicte-details.html', context)
+ else:
+ return HttpResponseRedirect('/?proposal_pending=True')
+
+
+def ReviewProposals(request, proposal_id=None, textbook_id=None):
+ context = {}
+ user = request.user
+ if is_reviewer(user):
+ context['reviewer'] = user
+ if proposal_id:
+ proposal = Proposal.objects.get(id=proposal_id)
+ accepted_book = TempBook.objects.get(id=textbook_id)
+ new_book = Book()
+ new_book.title = accepted_book.title
+ new_book.author = accepted_book.author
+ new_book.category = accepted_book.category
+ new_book.publisher_place = accepted_book.publisher_place
+ new_book.isbn = accepted_book.isbn
+ new_book.edition = accepted_book.edition
+ new_book.year_of_pub = accepted_book.year_of_pub
+ new_book.no_chapters = accepted_book.no_chapters
+ new_book.contributor = proposal.user
+ new_book.reviewer = Reviewer.objects.get(pk=1)
+ new_book.save()
+ proposal.status = "samples"
+ proposal.accepted = new_book
+ proposal.save()
+ add_log(user, proposal, CHANGE, 'Proposal accepted', proposal.id)
+ return HttpResponseRedirect("/proposal-review")
+ else:
+ new_proposals = Proposal.objects.filter(status="pending")
+ old_proposals = []
+ old_proposal_status = ['samples', 'sample disapproved', 'sample resubmitted', 'sample submitted']
+ proposals = Proposal.objects.filter(status__in=old_proposal_status)
+ for proposal in proposals:
+ try:
+ sample_notebook = SampleNotebook.objects.get(proposal=proposal)
+ except:
+ sample_notebook = None
+ obj = {'proposal':proposal, 'sample':sample_notebook}
+ old_proposals.append(obj)
+ if new_proposals.count() > 0:
+ no_new_proposal = False
+ else:
+ no_new_proposal = True
+ context['no_new_proposal'] = no_new_proposal
+ context['proposals'] = new_proposals
+ context['old_proposals'] = old_proposals
+ return render_to_response('tbc/review-proposal.html', context)
+ else:
+ return HttpResponse("not allowed")
+
+
+def DisapproveProposal(request, proposal_id=None):
+ context = {}
+ context.update(csrf(request))
+ proposal = Proposal.objects.get(id=proposal_id)
+ if request.method == 'POST':
+ changes_required = request.POST['changes_required']
+ subject = "Python-TBC: Corrections Required in the sample notebook"
+ message = "Hi, "+proposal.user.user.first_name+",\n"+\
+ "Sample notebook for the book titled, "+proposal.accepted.title+"\
+ requires following changes: \n"+\
+ changes_required
+ add_log(request.user, proposal, CHANGE, 'Sample disapproved',
+ proposal_id, chat=subject + '\n' + changes_required)
+ context.update(csrf(request))
+ proposal.status = "sample disapproved"
+ proposal.save()
+ email_send(proposal.user.user.email, subject, message)
+ return HttpResponseRedirect("/book-review/?mail_notify=done")
+ else:
+ context['proposal'] = proposal
+ return render_to_response('tbc/disapprove-sample.html', context)
+
+
+def AllotBook(request, proposal_id=None):
+ context = {}
+ proposal = Proposal.objects.get(id=proposal_id)
+ proposal.status = "book alloted"
+ proposal.save()
+ subject = "Python-TBC: Book Alloted"
+ message = "Hi "+proposal.user.user.first_name+",\n"+\
+ "The book has been alloted to you."
+ add_log(request.user, proposal, CHANGE, 'Book alloted', proposal_id)
+ email_send(proposal.user.user.email, subject, message)
+ return HttpResponseRedirect("/book-review/?book_alloted=done")
+
+
+def RejectProposal(request, proposal_id=None):
+ context = {}
+ context.update(csrf(request))
+ proposal = Proposal.objects.get(id=proposal_id)
+ if request.method == 'POST':
+ books = proposal.textbooks.all()
+ if len(books) == 1:
+ aicte_book = AicteBook.objects.get(isbn=books[0].isbn)
+ aicte_book.proposed = False
+ aicte_book.save()
+ proposal.status = 'rejected'
+ proposal.save()
+ remarks = request.POST['remarks']
+ subject = "Python-TBC: Rejection of Proposal"
+ message = "Dear "+proposal.user.user.first_name+"\nYour proposal has been\
+ rejected. "+request.POST.get('remarks')
+ add_log(request.user, proposal, CHANGE, 'Proposal rejected',
+ proposal.id, chat=subject + '\n' + remarks)
+ email_send(proposal.user.user.email, subject, message)
+ context.update(csrf(request))
+ return HttpResponseRedirect("/book-review/?reject-proposal=done")
+ else:
+ context['proposal'] = proposal
+ return render_to_response('tbc/reject-proposal.html', context)
+
+
+def SubmitSample(request, proposal_id=None, old_notebook_id=None):
+ context = {}
+ user = request.user
+ context.update(csrf(request))
+ if request.method == "POST":
+ curr_proposal = Proposal.objects.get(id=proposal_id)
+ add_log(user, curr_proposal, CHANGE, 'Sample Submitted', curr_proposal.id)
+ if old_notebook_id:
+ old_notebook = SampleNotebook.objects.get(id=old_notebook_id)
+ old_notebook.proposal = curr_proposal
+ old_notebook.name = request.POST.get('ch_name_old')
+ old_notebook.sample_notebook = request.FILES['old_notebook']
+ old_notebook.save()
+ curr_proposal.status = "sample resubmitted"
+ curr_proposal.save()
+ return HttpResponseRedirect('/?sample_notebook=done')
+ else:
+ sample_notebook = SampleNotebook()
+ sample_notebook.proposal = curr_proposal
+ sample_notebook.name = request.POST.get('ch_name')
+ sample_notebook.sample_notebook = request.FILES['sample_notebook']
+ sample_notebook.save()
+ curr_proposal.status = "sample submitted"
+ curr_proposal.save()
+ return HttpResponseRedirect('/?sample_notebook=done')
+ else:
+ profile = Profile.objects.get(user=user)
+ try:
+ proposal = Proposal.objects.get(user=profile, status__in=['samples','sample disapproved'])
+ except Proposal.DoesNotExist:
+ return HttpResponseRedirect('/?cannot_submit_sample=True')
+ try:
+ old_notebook = SampleNotebook.objects.get(proposal=proposal)
+ context['has_old'] = True
+ context['old_notebook'] = old_notebook
+ context['proposal'] = proposal
+ return render_to_response('tbc/submit-sample.html', context)
+ except:
+ context['proposal'] = proposal
+ return render_to_response('tbc/submit-sample.html', context)
+
+
+def ConfirmBookDetails(request):
context = {}
current_user = request.user
user_profile = Profile.objects.get(user=current_user)
try:
- book_to_update = Book.objects.get(contributor=user_profile, approved=False) or None
+ proposal = Proposal.objects.get(user=user_profile, status__in=["book alloted", "codes disapproved"])
except:
- return HttpResponseRedirect("/?not_found=True")
- title = book_to_update.title
- chapters = Chapters.objects.filter(book=book_to_update)
- screenshots = ScreenShots.objects.filter(book=book_to_update)
+ return HttpResponseRedirect('/?no_book_alloted=true')
+ book_to_update = Book.objects.get(id=proposal.accepted.id)
+ if proposal.status == "codes disapproved":
+ chapters = Chapters.objects.filter(book=book_to_update)
+ screen_shots = ScreenShots.objects.filter(book=book_to_update)
+ context.update(csrf(request))
+ context['book'] = book_to_update
+ context['chapters'] = chapters
+ context['screenshots'] = screen_shots
+ return render_to_response('tbc/update-code.html', context)
if request.method == 'POST':
book_form = BookForm(request.POST, instance=book_to_update)
if book_form.is_valid():
- file_path = os.path.abspath(os.path.dirname(__file__))
- file_path = file_path+"/static/uploads/"
- directory = file_path+book_to_update.contributor.user.first_name
- os.chdir(directory)
- os.popen("mv '"+title+"' '"+book_to_update.title+"'")
data = book_form.save(commit=False)
data.contributor = user_profile
data.save()
context.update(csrf(request))
context['form'] = book_form
- return HttpResponseRedirect('/update-content/'+str(book_to_update.id))
+ add_log(current_user, book_to_update, CHANGE, 'Book updated', proposal.id)
+ return HttpResponseRedirect('/submit-code/')
else:
book_form = BookForm()
book_form.initial['title'] = book_to_update.title
@@ -334,13 +676,40 @@ def UpdateBook(request):
book_form.initial['reviewer'] = book_to_update.reviewer
context.update(csrf(request))
context['form'] = book_form
- return render_to_response('tbc/update-book.html', context)
-
+ context['book'] = book_to_update
+ return render_to_response('tbc/confirm-details.html', context)
-def ContentUpload(request, book_id=None):
- context = {}
+
+def SubmitCode(request):
user = request.user
- curr_book = Book.objects.get(id=book_id)
+ curr_profile = Profile.objects.get(user=user)
+ context = {}
+ try:
+ curr_proposal = Proposal.objects.get(user=curr_profile, status__in=['book alloted', 'codes disapproved'])
+ curr_book = curr_proposal.accepted
+ except:
+ return HttpResponseRedirect('/?no_book_alloted=true')
+ if curr_proposal.status == "codes disapproved":
+ if request.method == 'POST':
+ chapters = Chapters.objects.filter(book=curr_book)
+ screen_shots = ScreenShots.objects.filter(book=curr_book)
+ counter = 1
+ for chapter in chapters:
+ chapter.name = request.POST['chapter'+str(counter)]
+ chapter.notebook = request.FILES['notebook'+str(counter)]
+ chapter.save()
+ counter += 1
+ counter = 1
+ for screenshot in screen_shots:
+ screenshot.caption = request.POST['caption'+str(counter)]
+ screenshot.image = request.FILES['image'+str(counter)]
+ screenshot.save()
+ counter += 1
+ curr_proposal.status = "codes submitted"
+ curr_proposal.save()
+ add_log(user, curr_book, CHANGE, 'Codes & Screenshots Resubmitted',
+ curr_proposal.id)
+ return HttpResponseRedirect('/')
if request.method == 'POST':
for i in range(1, curr_book.no_chapters+1):
chapter = Chapters()
@@ -355,6 +724,9 @@ def ContentUpload(request, book_id=None):
screenshot.book = curr_book
screenshot.save()
book = Book.objects.order_by("-id")[0]
+ proposal = Proposal.objects.get(accepted=book)
+ proposal.status = "codes submitted"
+ proposal.save()
subject = "Python-TBC: Book Submission"
message = "Hi "+curr_book.reviewer.name+",\n"+\
"A book has been submitted on the Python TBC interface.\n"+\
@@ -366,14 +738,19 @@ def ContentUpload(request, book_id=None):
"ISBN: "+curr_book.isbn+"\n"+\
"Follow the link to review the book: \n"+\
"http://tbc-python.fossee.in/book-review/"+str(curr_book.id)
+ log_chat = subject + '\n' + 'Book ' + curr_book.title + \
+ ' has been submitted on the Python TBC interface.'
+ add_log(user, curr_book, CHANGE, 'Chapters and Screenshots added',
+ proposal.id, chat=log_chat)
email_send(book.reviewer.email, subject, message)
return HttpResponseRedirect('/?up=done')
- context.update(csrf(request))
- context['user'] = user
- context['curr_book'] = curr_book
- context['no_notebooks'] = [i for i in range(1, curr_book.no_chapters+1)]
- context['no_images'] = [i for i in range(1, 4)]
- return render_to_response('tbc/upload-content.html', context)
+ else:
+ context.update(csrf(request))
+ context['user'] = user
+ context['curr_book'] = curr_book
+ context['no_notebooks'] = [i for i in range(1, curr_book.no_chapters+1)]
+ context['no_images'] = [i for i in range(1, 4)]
+ return render_to_response('tbc/upload-content.html', context)
def UpdateContent(request, book_id=None):
@@ -395,6 +772,7 @@ def UpdateContent(request, book_id=None):
screenshot.image = request.FILES['image'+str(i)]
screenshot.book = current_book
screenshot.save()
+ proposal = Proposal.objects.get(accepted=current_book)
subject = "Python-TBC: Book Updated"
message = "Hi "+current_book.reviewer.name+",\n"+\
"Submission for a book has been updated on the Python TBC interface.\n"+\
@@ -406,6 +784,10 @@ def UpdateContent(request, book_id=None):
"ISBN: "+current_book.isbn+"\n"+\
"Follow the link to review the book: \n"+\
"http://dev.fossee.in/book-review/"+str(current_book.id)
+ log_chat = subject + '\n' + current_book.title +\
+ ' book has been updated on the Python TBC interface.'
+ add_log(user, current_book, CHANGE, 'book updated', proposal.id,
+ chat=log_chat)
email_send(current_book.reviewer.email, subject, message)
return HttpResponseRedirect('/?update_book=done')
else:
@@ -461,7 +843,7 @@ def BookDetails(request, book_id=None):
context['images'] = images
context['book'] = book
return render_to_response('tbc/book-details.html', context)
-
+
def BookReview(request, book_id=None):
context = {}
@@ -470,9 +852,13 @@ def BookReview(request, book_id=None):
book = Book.objects.get(id=book_id)
chapters = Chapters.objects.filter(book=book).order_by('name')
images = ScreenShots.objects.filter(book=book)
+ proposal = Proposal.objects.get(accepted=book)
+ logs = ActivityLog.objects.filter(proposal_id=proposal.id)
+ context['logs'] = logs
context['chapters'] = chapters
context['images'] = images
context['book'] = book
+ context['proposal'] = proposal
context['reviewer'] = request.user
context.update(csrf(request))
return render_to_response('tbc/book-review-details.html', context)
@@ -482,6 +868,8 @@ def BookReview(request, book_id=None):
if 'mail_notify' in request.GET:
context['mail_notify'] = True
books = Book.objects.filter(approved=False)
+ approved_books = Book.objects.filter(approved=True)
+ context['approved_books'] = approved_books
context['books'] = books
context['reviewer'] = request.user
context.update(csrf(request))
@@ -498,6 +886,9 @@ def ApproveBook(request, book_id=None):
book = Book.objects.get(id=book_id)
book.approved = True
book.save()
+ proposal = Proposal.objects.get(accepted=book)
+ proposal.status = "book completed"
+ proposal.save()
file_path = os.path.abspath(os.path.dirname(__file__))
copy_path = "/".join(file_path.split("/")[1:-2])
copy_path = "/"+copy_path+"/Python-Textbook-Companions/"
@@ -531,6 +922,8 @@ def ApproveBook(request, book_id=None):
"IIT Bombay, Powai, Mumbai - 400076\n"+\
"Kindly, write Python Texbook Companion on top of the envelope.\n\n\n"+\
"Regards,\n"+"Python TBC,\n"+"FOSSEE, IIT - Bombay"
+ add_log(user, book, CHANGE, 'Book approved', proposal.id,
+ chat=subject + '\n' + message)
email_send(book.reviewer.email, subject, message)
context['user'] = user
return HttpResponseRedirect("/book-review/?book_review=done")
@@ -541,19 +934,24 @@ def ApproveBook(request, book_id=None):
return HttpResponseRedirect("/book-review/"+book_id)
else:
return render_to_response('tbc/forbidden.html')
-
+
def NotifyChanges(request, book_id=None):
context = {}
if is_reviewer(request.user):
book = Book.objects.get(id=book_id)
+ proposal = Proposal.objects.get(accepted=book)
if request.method == 'POST':
+ proposal.status = "codes disapproved"
+ proposal.save()
changes_required = request.POST['changes_required']
subject = "Python-TBC: Corrections Required"
message = "Hi, "+book.contributor.user.first_name+",\n"+\
"Book titled, "+book.title+" requires following changes: \n"+\
changes_required
context.update(csrf(request))
+ add_log(request.user, book, CHANGE, 'Changes notification',
+ proposal.id, chat=subject+'\n'+changes_required)
email_send(book.contributor.user.email, subject, message)
return HttpResponseRedirect("/book-review/?mail_notify=done")
else:
@@ -665,3 +1063,26 @@ def RedirectToIpynb(request, notebook_path=None):
notebook = "/".join(notebook)
redirect_url = "https://ipynb.fossee.in/"+notebook
return redirect(redirect_url)
+
+
+# ajax views
+@csrf_exempt
+def ajax_matching_books(request):
+ titles = request.POST["titles"]
+ titles = json.loads(titles)
+ matches = []
+ i = 1
+ flag = None
+ for title in titles:
+ if title:
+ match = TempBook.objects.filter(title__icontains=title)
+ if match:
+ flag = True
+ matches.append(match)
+ else:
+ matches.append(None)
+ context = {
+ 'matches': matches,
+ 'flag': flag
+ }
+ return render_to_response('tbc/ajax-matching-books.html', context)