def addtopic(request):

	context= {
			'title':'Add Topic',
	}

	#Check for POST data.
	if request.method == 'POST':

		topicform = TopicForm(request.POST)

		if topicform.is_valid():

			#Get the topic post data
			topic_name = request.POST['name']
			topic_description = request.POST['description']
			topic_category = request.POST['category']
			topic_user = request.user
			topic_slug = generate_topic_slug()
			
			#Create a new topic and save it.
			topic = Topic(
										name=topic_name,
										description=topic_description,
										user=topic_user,
										category=topic_category,
										topic_slug = topic_slug
										)
			topic.save()

			#Create a new directory for the topic.
			directory = create_directory(topic,settings.UPLOADED_TOPIC_DIR)

			#Get the files
			files = request.FILES

			#Thesea re the names of hte files.
			for name,f in files.iteritems():

				#Single file upload
				#Get the file
				name = f.name
				fileName = "%s-%s" % (uuid4(),name)
				#The uploaded_topic_dir is in PDTtool.settings.
				location = '%s/%s' % (directory, fileName)
				#Handle the filesize.
				fileSize = f.size

				#Load a new uploaded file and save it.
				uploadedfile = Document(topic=topic,
																location = location,
															  name=name,
															  fileName=fileName,
															  size=fileSize)
				uploadedfile.save()

				#Save the file on to the directory.
				handle_uploaded_file(f,location)

				topic.documents.add(uploadedfile)

			#Return the redirect.
			return redirect('/viewtopic/?publicid=%s#added' % topic.publicid)

	else:
		#Create an unbound post data.
		topicform = TopicForm

	#Make a context variable
	#	for the topicform.
	context['topicform'] = topicform

	return render(request,
					'topic_management/addtopic.html',
					context)
  def create_topics(self,extuser=False,username='******'):

    if not extuser:
      extuser = self.create_user(username, groups = ('Program Manager',))

    topic1 = Topic(
                  user=extuser.user,
                  name='Topic1',
                  category='Outline',
                  topic_slug='UNIQUEVL',
                  )

    topic2 = Topic(
                  user=extuser.user,
                  name='Topic2',
                  category='Outline',
                  topic_slug='OTHER',
                  )

    topic1.save()
    topic2.save()

    document1 = Document(
              location='fakepath',
              name='Document1 A Document Name XCVF',
              fileName='fakepath/doc.docx',
              size=200,
              topic=topic1,
      )

    document1.save()

    document2 = Document(
              location='fakepath',
              name='Document2 A Document Name XCVF',
              fileName='fakepath/doc.docx',
              size=200,
              topic=topic1,
      )

    document2.save()

    topic1.documents.add(document1,document2)

    document3 = Document(
              location='fakepath',
              name='Document3 A Document Name XCVF',
              fileName='fakepath/doc.docx',
              size=200,
              topic=topic2,
    )
    document4 = Document(
              location='fakepath',
              name='Document4 A Document Name XCVF',
              fileName='fakepath/doc.docx',
              size=200,
              topic=topic2,
    )

    document3.save()
    document4.save()
    topic2.documents.add(document3,document4)
def viewtopic(request):
	#If there is no topic.
	notopic = True
	#If true a Toastr notification for comments will be shown.
	commentnotification = False
	#If a topic has been approved.
	releasednotification = False
	#If a document has been updated.
	updatednotification = False
	#If a document has been added.
	addednotification = False
	#If a document has been deleted.
	deleteddocumentdnotification = False
	#Add a variable to check if the user owns the topic
	user_is_owner = False
	#Get the public id of the topic.
	if 'publicid' in request.GET:
		#This is the publicid.
		publicid = request.GET['publicid']

		#The directory of the location of the documents
		topicdirectory = "%s/%s"% (settings.UPLOADED_TOPIC_DIR, publicid)

		try:
			#Check for a topic.
			topic_object = Topic.objects.get(publicid=publicid,deleted=False)
			notopic = False
		except ObjectDoesNotExist:
			#If the topic does not exist.
			notopic = True

	#If there is no topic.
	if notopic:
		#Redirect if the topic is not found
		#		to the list of topics.
		return redirect('/viewtopics/')


	#Check for POST data
	if request.method == 'POST':

		"""
		" These can only be accessed if a user is the owner or a Supervisor
		"""			
		if topic_object.user == request.user or request.user.groups.filter(Q(name='Supervisor')).count() != 0:

			#Update the description of the topic.
			if 'update_topic_description' in request.POST and topic_object.publicid == request.POST['update_topic_description']:
				#Update the description.
				topic_object.description = request.POST['description']
				#Save the topic_object.
				topic_object.save()
			
			#Ready the topic for review
			topic_ready_for_review_index = 'topic_ready_for_review_id'

			#Check if the topic is ready for review.
			if (
				topic_ready_for_review_index in request.POST and
				request.POST[topic_ready_for_review_index] == topic_object.publicid
				):

				#Update the topic presentation length.
				if 'topic_presentationlength' in request.POST:
					#Set the topic ready for review.
					readyforreview = True
					#Set the presentation length to the length entered.
					presentationlength = int(request.POST['topic_presentationlength'])
					#Add a datetime for the time it was set.
					topic_object.datesetforreview = datetime.now()
				else:
					#The topic is not ready for review.
					readyforreview = False
					#Update the presentationlength.
					presentationlength = 15

				#Set the fields in the database.
				topic_object.readyforreview = readyforreview
				topic_object.presentationlength = presentationlength

				#Save the topic object.
				topic_object.save()

				#Reset the meeting duration.
				if topic_object.meeting:
					#This is the topic_meeting.
					topic_meeting = topic_object.meeting;
					#Set the duration to 0.
					duration = 0
					#Loop through each of the topic in the meeting.
					for t in topic_meeting.topics.all():
						#Increment the duration.
						duration += t.presentationlength

					#Set the meeting duration.
					topic_meeting.duration = duration
					#Save the topic meeting.
					topic_meeting.save()

			#We deleted the topic.
			if 'deleted_topicid' in request.POST and request.POST['deleted_topicid'] == topic_object.publicid:
				#Delete the topic object
				topic_object.deleted = True
				topic_object.save()

				#Move the files to a 'deleted' directory.
				delete_topic(topic_object)

				#Redirect to the list of topics, there is a hash
				#		for a notification.
				return redirect('/viewtopics/?deleted=%s' % topic_object.name)

			#We approved the document.
			if 'released_topicid' in request.POST and request.POST['released_topicid'] == topic_object.publicid:
				#In the topic_object set the supervisor_released true.
				topic_object.supervisor_released = True
				#Save the topic.
				topic_object.save()

				directory = create_directory(topic_object,settings.APPROVED_TOPIC_DIR)

				#Loop throught the document and copy
				#		them to the right directory.
				for document in topic_object.documents.all():

					#Get the approved file.
					approved_file = "%s/%s" % (directory,document.fileName)

					#Make a copy of the file.
					copyfile(document.location, approved_file)

			#We have an updated document.
			if 'updated_documentid' in request.POST:

				#Get the updated document
				updated_document = topic_object.documents.filter(publicid=request.POST['updated_documentid'])
				#Get the document
				if updated_document.exists():

					#Get the old file and delete.
					old_file_path = updated_document.values()[0]['location']

					try:
						#Delete the old file.
						os.remove(old_file_path)
					except OSError:
						print "deleted file not found, but it doesn't really matter"

					#Get the uploaded file.
					f = request.FILES['file']

					#Single file upload
					#Get the file
					name = f.name
					fileName = "%s-%s" % (uuid4(),name)
					#The uploaded_topic_dir is in PDTtool.settings.
					location = '%s/%s' % (topicdirectory, fileName)
					#Get the file size.
					fileSize = f.size
					#Get the updated document
					updated_document.update(location=location,name=name,fileName=fileName,size=fileSize)
	 				#handle the uploaded file.
					handle_uploaded_file(f,location)

					#Updated notification
					updatednotification = True

			#We have an updated document.
			if 'deleted_documentid' in request.POST:

				#Get the updated document
				deleted_document = topic_object.documents.filter(publicid=request.POST['deleted_documentid'])
				#Get the document
				if deleted_document.exists():

					#Get the old file and delete.
					file_path = deleted_document.values()[0]['location']

					try:
						#Delete the file
						os.remove(file_path)
					except OSError:
						print "deleted file not found, but it doesn't really matter"

					#Remove the m2m relationship.
					topic_object.documents.remove(deleted_document.values()[0]['id'])
					#Delete the document.
					deleted_document.delete()
					#Delete the document notification.
					deleteddocumentdnotification = True


			#We have added a document.
			if 'add_document' in request.POST:

				#Get the uploaded file.
				f = request.FILES['file']

				#Single file upload
				#Get the file
				name = f.name
				fileName = "%s-%s" % (uuid4(),name)

				#The uploaded_topic_dir is in PDTtool.settings.
				location = '%s/%s' % (topicdirectory, fileName)
				fileSize = f.size
				#This is the newdocument.
				newdocument = Document(topic=topic_object,location=location,name=name,fileName=fileName,size=fileSize)
				newdocument.save()
				#Add the document to the topic.
				topic_object.documents.add(newdocument)
				#Upload the file
				handle_uploaded_file(f,location)
				#Updated notification
				addednotification = True

		"""
		" The following adds comments to the specified object
		"""
		#Add a comment to the topic
		if 'topicid' in request.POST and request.POST['topicid'] == topic_object.publicid:
			#This is the content of a topic
			content = request.POST['content']
			#Create a new comment.
			newcomment = Comment(user=request.user,content=content)
			#Save the comment.
			newcomment.save()
			#Add the comment to the topic.
			topic_object.comments.add(newcomment)
			#Create a variable to notify the user of success.
			commentnotification = True

		#Assumes the document exists.
		#Add a comment to the document
		if 'documentid' in request.POST:
			#This is the publicid of the commented document.
			documentid = request.POST['documentid']
			#Get the document.
			document_object = Document.objects.get(publicid=documentid)
			#Get the content of the comment.
			content = request.POST['content']
			#Create a new comment object.
			newcomment = Comment(user=request.user,content=content)
			#Save the comment.
			newcomment.save()
			#Add the comment to the document.
			document_object.comments.add(newcomment)
			#Create a variable to notify the user of success.
			commentnotification = True

		#Assumes the comment exists.
		#Add a reply to the comment.
		if 'commentid' in request.POST:
			#Get the publicid of the comment being replied to..
			commentid = request.POST['commentid']
			#Get the comment being replied to by publicid.
			comment_object = Comment.objects.get(publicid=commentid)
			#Get the content of the reply.
			content = request.POST['content']
			#Create a new comment object.
			newcomment = Comment(user=request.user,content=content)
			newcomment.save()
			#Add the comment to the collection of comments.
			comment_object.comments.add(newcomment)
			#Add a variable to notify the user of success.
			commentnotification = True

		"""
		" End the logic to add comments.
		"""

	#Get the topic
	topic = {
		#Store the topic_object
		'topic_object':topic_object,
		#Get the comments
		'comments':[
			#Get the comments for the topic
			{'html':str(recursive_comments(request, comment.publicid))}
			#Run a loop on the comments.
			for comment in topic_object.comments.all() 
		],
		#Get the comment form for the topic.
		'comment_form':comment_form(request,'topic',topic_object.publicid),
		#Add this document.
	  'add_document':form_modal(request,
														'add_document',
														upload_document_form().as_table(),
														'Add a document to the topic',
														multipart=True,
														modal_id="add_document",
														formname_value='add a document',
														action=request.get_full_path(),
														submit_text='upload'
														),
	}

	#Get all of the documents with their comments. 
	documents = [
		#Get all of the documents.
		{'document_object':document,
			#Get the form for updating a document, this just replaces 
			#		the file with a new one in the topics collection of documents.
			#	There is no revision control.
		 'update_document_form':form_modal(request,
		 																	#The name of the variable to identify
		 																	#		an update document variable.
																			'updated_documentid',
																			#Get the form html as a table.
																			upload_document_form().as_table(),
																			#This is the title of the bootstrap modal.
																			'Upload a Revised Document',
																			#Create a text/multipart type for the form
																			multipart=True,
																			#Add a special identifier to the form.
																			modal_id="update_document_"+document.publicid,
																			#Add a custom value to the form name, it is
																			#		used to identify the topic.
																			formname_value=document.publicid,
																			#Create a special action for the form to submit to.
																			action=request.get_full_path()
																			),
		 #Create a modal to check if the user wants to delete the 
		 #		document from a collection of topics.
		 'deleted_document_form':form_modal(request,
		 																	#This is the name of the form.
																			'deleted_documentid',
																			#This is the message for the document name.
																			"You will delete '%s'"%document.name,
																			#This is the content of the modal.
																			'Are you sure?',
																			#Add a special identifier to the form.
																			modal_id="deleted_document_"+document.publicid,
																			#Add a custom value to the form name, it is 
																			#			used to identify the topic.
																			formname_value=document.publicid,
																			#Specify a custom request string.
																			action=request.get_full_path(),
																			#Custom submit button text.
																			submit_text="Yes",
																			#A custom button class.
																			submit_button_class="btn-danger",
																			#Custom cancel button text.
																			close_button_text='Cancel',
																			#Custom close button classes.
																			close_button_class='pull-right margin-left-10'
																			),
		 #Get the comments for the topic.
		 'comments':[
		 	#Get the comments for each document.
			{'html':str(recursive_comments(request, comment.publicid))}
			#Run a loop on the comments.
			for comment in document.comments.all()
		],
		#Add a comment to the form.
		'comment_form':comment_form(request,'document',document.publicid),
		}
		#Run a loop on the documents
		for document in topic_object.documents.all()
	]

	#Check to see if the user owns the topic
	if topic_object.user.id == request.user.id:
		#Add a user to the owner of the form.
		user_is_owner = True

	#Load in some context variables.
	context= {
		#The textual title of the page.
		'title':'View Topic',
		#Add a topic to the template.
		'topic': topic,
		#Add documents to the template.
		'documents': documents,
		#A flag for whether or not a success notification
		#		for the comments should go up.
		'commentnotification': commentnotification,
		#A flag for whether or not a success notification
		#		for the release of topic should go up.
		'releasednotification' : releasednotification,
		#A flag for whether or not a success notification
		#		for the updating of a document should go up.
		'updatednotification' : updatednotification,
		#A flag for whether or not an notification for
		#		the updating of a document should go up.
		'deleteddocumentdnotification' : deleteddocumentdnotification,
		#A flag for whether or not a success notification
		#		for the adding of a document to the
		#		collection of topics.
		'addednotification' : addednotification,
		#A flag to indicate if the currently logged  in user
		#		owns the document.
		'user_is_owner' : user_is_owner,
	}

	#Render the template and return it for the user.
	return render(request,
		'topic_management/viewtopic.html',
		context)