def attachments_upload(self, request, obj): obj = obj or self.get_upload_session(request, create=True) if 'attachment' in request.FILES: attachment = Attachment(attachment=request.FILES['attachment'], content_object=obj) attachment.save() return self.attachments_list(request, obj)
def attachment_upload(self, request, **kwargs): self.method_check(request, allowed=['post']) apikey_auth = ApiKeyAuthentication() if apikey_auth.is_authenticated(request) == True: if request.user.is_staff: if 'multipart/form-data' not in str(request.META['CONTENT_TYPE']): return self.create_response(request, { 'error': 'Unsupported media type', }, HttpBadRequest) else: if ('file' in request.FILES): file = request.FILES['file'] name = request.POST.get('name', file.name) attachment = Attachment(user=request.user, name=name, file=file) attachment.save() return self.create_response( request, {'id': attachment.id, 'url': request.build_absolute_uri(attachment.file.url)}) else: return self.create_response(request, { 'error': 'No file found', }, HttpBadRequest) else: return self.create_response(request, {}, HttpUnauthorized)
def test_upload(self): file_data = b"0123456789" temp_attachment = self.create_temporary_attachment(file_data, "test.txt") temp_attachment.save() saved_test_file_name = os.path.join(settings.MEDIA_ROOT, temp_attachment.attachment.name) file_readed = open(saved_test_file_name, 'rb').read() self.assertEqual(file_data, file_readed) test_object = UploadSession() test_object.save() attachment = Attachment( attachment = temp_attachment.attachment.name, content_type = ContentType.objects.get_for_model(test_object.__class__), object_id = test_object.id ) attachment.save() temp_attachment.delete() # Test na vymazanie with self.assertRaises(IOError): open(saved_test_file_name, 'rb').read() saved_file_name = os.path.join(settings.MEDIA_ROOT, attachment.attachment.name) file_readed = open(saved_file_name, 'rb').read() self.assertEqual(file_data, file_readed)
def setUp(self): self.user1 = User.objects.create_user( 'bertie', '*****@*****.**', 'bertword') self.user1.is_active = True self.user1.save() self.user2 = User.objects.create_user('dave', '*****@*****.**', 'dave') self.user2.is_active = True self.user2.save() self.user3 = User.objects.create_user( 'Chuck Norris', '*****@*****.**', 'dontask') self.user3.is_active = True self.user3.save() self.course1 = Course(**course1_data) self.course1.organiser = self.user1 self.course1.instructor = self.user1 self.course1.save() self.uc = UserCourse(course=self.course1, user=self.user2) self.uc.save() self.lesson1 = Lesson(name="Test Lesson 1", course = self.course1) self.lesson1.save() #att1 attached to course self.att1 = Attachment(course=self.course1, **self.att1_data) self.att1.save() #att2 attached to lesson self.att2 = Attachment(lesson=self.lesson1, **self.att1_data) self.att2.save() with open('media/attachments/empty_attachment_test.txt', 'w') as f: f.write('test')
def attachments_upload(self, request, obj): obj = obj or self.get_upload_session(request, create=True) if 'attachment' in request.FILES: attachment = Attachment( attachment=request.FILES['attachment'], content_object=obj ) attachment.save() return self.attachments_list(request, obj)
def move_attachments(self, content_object): temp_attachments = self.get_attachments() for temp_attachment in temp_attachments: attachment = Attachment( attachment = temp_attachment.attachment.name, content_type = ContentType.objects.get_for_model(content_object.__class__), object_id = content_object.pk ) attachment.save() temp_attachment.delete()
def test_available_size(self): new_settings = {'ATTACHMENT_MAX_SIZE': -1, 'ATTACHMENT_SIZE_FOR_CONTENT': {self.ct: -1}} with self.settings(**new_settings): self.assertEqual(Attachment.get_available_size(self.testContentType.pk, 0), -1) new_settings['ATTACHMENT_MAX_SIZE'] = 1 with self.settings(**new_settings): self.assertEqual(Attachment.get_available_size(self.testContentType.pk, 0), 1) new_settings['ATTACHMENT_MAX_SIZE'] = -1 new_settings['ATTACHMENT_SIZE_FOR_CONTENT'][self.ct] = 1 with self.settings(**new_settings): self.assertEqual(Attachment.get_available_size(self.testContentType.pk, 0), 1)
def setUp(self): self.user1 = User.objects.create_user('bertie', '*****@*****.**', 'bertword') self.user1.is_active = True self.user1.save() self.user2 = User.objects.create_user('flo', '*****@*****.**', 'flo') self.user2.is_active = True self.user2.save() self.course1 = Course(**course1_data) self.course1.instructor = self.user1 self.course1.organiser = self.user1 self.course1.save() self.course2 = Course(**course2_data) self.course2.instructor = self.user1 self.course2.organiser = self.user1 self.course2.save() self.uc = UserCourse(course=self.course1, user=self.user2) self.uc.save() self.lesson1 = Lesson(name="Test Lesson 1", course = self.course1) self.lesson1.save() self.lesson2 = Lesson(name="Test Lesson 2", course = self.course2) self.lesson2.save() #att1 attached to course self.att1 = Attachment(course=self.course1, **self.att1_data) self.att1.save() #att2 attached to lesson self.att2 = Attachment(lesson=self.lesson1, **self.att1_data) self.att2.save() #att3 attached to lesson in course2 self.att3 = Attachment(lesson=self.lesson2, **self.att1_data) self.att3.save() self.u_att1 = UserAttachment(attachment=self.att1, user=self.user2) self.u_att2 = UserAttachment(attachment=self.att2, user=self.user2) self.u_att1.save() self.u_att2.save()
class UserAttachmentModelTests(TestCase): """Test model behaviour of user interaction with attachments""" att1_data = { 'name': 'Reading List', 'desc': 'Useful stuff you might need', 'seq': 3, 'attachment': 'empty_attachment_test.txt', } att2_data = { 'name': 'Grammer Guide', 'desc': 'How do you even spell grammer?', 'seq': 2, 'attachment': 'empty_attachment_test.txt', } def setUp(self): self.user1 = User.objects.create_user('bertie', '*****@*****.**', 'bertword') self.user1.is_active = True self.user1.save() self.user2 = User.objects.create_user('flo', '*****@*****.**', 'flo') self.user2.is_active = True self.user2.save() self.course1 = Course(**course1_data) self.course1.instructor = self.user1 self.course1.organiser = self.user1 self.course1.save() self.course2 = Course(**course2_data) self.course2.instructor = self.user1 self.course2.organiser = self.user1 self.course2.save() self.uc = UserCourse(course=self.course1, user=self.user2) self.uc.save() self.lesson1 = Lesson(name="Test Lesson 1", course = self.course1) self.lesson1.save() self.lesson2 = Lesson(name="Test Lesson 2", course = self.course2) self.lesson2.save() #att1 attached to course self.att1 = Attachment(course=self.course1, **self.att1_data) self.att1.save() #att2 attached to lesson self.att2 = Attachment(lesson=self.lesson1, **self.att1_data) self.att2.save() #att3 attached to lesson in course2 self.att3 = Attachment(lesson=self.lesson2, **self.att1_data) self.att3.save() self.u_att1 = UserAttachment(attachment=self.att1, user=self.user2) self.u_att2 = UserAttachment(attachment=self.att2, user=self.user2) self.u_att1.save() self.u_att2.save() def test_hist2list(self): """Test conversion of JSON encoded history to tuple list""" #History will need some activity to test. Since model doesn't need a #download method, best to create this in views via client self.client.login(username='******', password='******') response = self.client.get('/interaction/attachment/1/download') assert(response) response = self.client.get('/interaction/attachment/1/download') h2l_output = self.u_att1.hist2list() self.assertIsInstance(h2l_output, list, "Output should be a list") for row in h2l_output: self.assertIsInstance(row, tuple, "Entry should be a tuple") self.assertIsInstance(row[0], datetime.datetime, "Should be a datetime") self.assertTrue(is_aware(row[0]), "Datetime not TZ aware") self.assertIn(row[1], UAActions, "Action should be DOWNLOADING etc") def test__checkrep(self): #TODO test the history checking in _checkrep self.fail("write me") def test___unicode__(self): self.assertEqual( u"UA:%s, User:%s, Attachment:%s" % \ (self.u_att2.pk, self.user2.pk, self.att2.pk), self.u_att2.__unicode__()) def test___str__(self): t = u"User {0}'s data for attachment: ...{1}" \ .format(self.user2.username, str(self.att1.attachment)[-10:]) s = self.u_att2.__str__() self.assertEqual(s, t) def test_get_absolute_url(self): t = u"/interaction/attachment/{0}/download/".format(self.att1.pk) url = self.u_att1.get_absolute_url() self.assertEqual(t,url) def test_save(self): """Test that save only saves when user is enrolled on course""" u_att3 = UserAttachment(attachment=self.att3, user=self.user2) u_att3.save() self.assertIsNone(u_att3.pk)
def create_message(request): token = request.headers.get('Authorization')[6:] form = MessageForm(request.POST, request.FILES) if form.is_valid(): # print(request.POST, request.FILES) data = request.POST my_id = Token.objects.filter(key=token).values('user_id')[0]['user_id'] message = Message(chat_id=data['chat_id'], user_id=my_id, content=data['content']) session = boto3.Session() s3_client = session.client(service_name='s3', endpoint_url='http://hb.bizmrg.com', aws_access_key_id='ns3JMEzqS7GkxRcCuvRDVh', aws_secret_access_key='8DvkXKZkUdebaEkBfnyGKhJBZaMaW4ybJdxwiN2WzeEv') if request.POST['attachment_type'] == 'null': print('without attachment') message.save() return JsonResponse({'Result':'Message created without attachment'}) elif request.POST['attachment_type'] == 'images': print('with images') message.save() uploaded_file = request.FILES.getlist('media') for file in uploaded_file: print(file) url_location = 'attachments/chat' + data['chat_id'] + '/' + data['attachment_type'] + '/' + file.name + '-' + str(hash(file)) s3_client.put_object(Bucket='z3hdro_messenger', Key=url_location, Body = file) attach = Attachment(chat_id=data['chat_id'], user_id=my_id, message_id=message.id, type_attachment=data['attachment_type'], url = url_location) attach.save() return JsonResponse({'Result':'Message created with image attachment'}) elif request.POST['attachment_type'] == 'audio_message': print('with audio') message.save() uploaded_file = request.FILES['media'] url_location = 'attachments/chat' + data['chat_id'] + '/' + data['attachment_type'] + '/' + 'audio-' + str(hash(uploaded_file)) s3_client.put_object(Bucket='z3hdro_messenger', Key=url_location, Body = uploaded_file) attach = Attachment(chat_id=data['chat_id'], user_id=my_id, message_id=message.id, type_attachment=data['attachment_type'], url = url_location) attach.save() return JsonResponse({'Result':'Message created with audiorecord attachment'}) elif request.POST['attachment_type'] == 'geolocation': print('with geolocation') message.save() attach = Attachment(chat_id=data['chat_id'], user_id=my_id, message_id=message.id, type_attachment=data['attachment_type'], url = data['geolocation_url']) attach.save() return JsonResponse({'Result':'Message created with geolocation'}) return JsonResponse({'error':'unexpected bug'}, status=400) return JsonResponse({'error': form.errors}, status=400, json_dumps_params={'ensure_ascii': False})
class UserAttachmentViewTests(TestCase): """Test view functions for user interaction with attachments""" att1_data = { 'name': 'Reading List', 'desc': 'Useful stuff you might need', 'seq': 3, 'attachment': 'attachments/empty_attachment_test.txt', } att2_data = { 'name': 'Grammer Guide', 'desc': 'How do you even spell grammer?', 'seq': 2, 'attachment': 'attachments/empty_attachment_test.txt', } def setUp(self): self.user1 = User.objects.create_user( 'bertie', '*****@*****.**', 'bertword') self.user1.is_active = True self.user1.save() self.user2 = User.objects.create_user('dave', '*****@*****.**', 'dave') self.user2.is_active = True self.user2.save() self.user3 = User.objects.create_user( 'Chuck Norris', '*****@*****.**', 'dontask') self.user3.is_active = True self.user3.save() self.course1 = Course(**course1_data) self.course1.organiser = self.user1 self.course1.instructor = self.user1 self.course1.save() self.uc = UserCourse(course=self.course1, user=self.user2) self.uc.save() self.lesson1 = Lesson(name="Test Lesson 1", course = self.course1) self.lesson1.save() #att1 attached to course self.att1 = Attachment(course=self.course1, **self.att1_data) self.att1.save() #att2 attached to lesson self.att2 = Attachment(lesson=self.lesson1, **self.att1_data) self.att2.save() with open('media/attachments/empty_attachment_test.txt', 'w') as f: f.write('test') def test_attachment_download_not_logged_in(self): """Casual visitor - download not permitted, redirect to login""" a1 = self.att1.id a2 = self.att2.id url1 = '/interaction/attachment/{0}/download/'.format(a1) url1_r = '/accounts/login/?next={0}'.format(url1) url2 = '/interaction/attachment/{0}/download/'.format(a2) url2_r = '/accounts/login/?next={0}'.format(url2) #First try attachment linked to course page response = self.client.get(url1) self.assertRedirects(response, url1_r, 302, 200) self.assertRaises(ObjectDoesNotExist, UserAttachment.objects.get, id=a1) #Second, try attachment linked to a lesson page response = self.client.get(url2) self.assertRedirects(response, url2_r, 302, 200) self.assertRaises(ObjectDoesNotExist, UserAttachment.objects.get, id=a2) # @override_settings(DEBUG=True) def test_attachment_download_author(self): """Course author can download attachments""" a1 = self.att1.id #attached to course a2 = self.att2.id #attached to lesson url1 = '/interaction/attachment/{0}/download/'.format(a1) url1_r = self.att1.get_absolute_url() url2 = '/interaction/attachment/{0}/download/'.format(a2) url2_r = self.att2.get_absolute_url() #First, try attachment linked to course page self.client.login(username='******', password='******') response = self.client.get(url1) self.assertEqual(response.status_code, 302) #having to comment out redirect tests as can't get TestClient to #server STATIC content #self.assertRedirects(response, url1_r, 302, 200) #Second, try attachment linked to lesson page response = self.client.get(url2) self.assertEqual(response.status_code, 302) #self.assertRedirects(response, url2_r, 302, 200) def test_attachment_download_loggedin_but_not_enrolled(self): """Not enrolled visitor - redirect to enrol page""" a1 = self.att1.id a2 = self.att2.id url1 = '/interaction/attachment/{0}/download/'.format(a1) url1_r = '/courses/{0}/enrol/'.format(self.att1.course.id) url2 = '/interaction/attachment/{0}/download/'.format(a2) url2_r = '/courses/{0}/enrol/'.format(self.att2.lesson.course.id) self.client.login(username='******', password='******') #First, try attachment linked to course page response = self.client.get(url1) self.assertRedirects(response, url1_r, 302, 200) self.assertRaises(ObjectDoesNotExist, UserAttachment.objects.get, id=a1) #Second, try attachment linked to lesson page response = self.client.get(url2) self.assertRedirects(response, url2_r, 302, 200) self.assertRaises(ObjectDoesNotExist, UserAttachment.objects.get, id=a2) def test_attachment_download_loggedin_and_enrolled(self): """Enrolled visitor - download is recorded""" a1 = self.att1.id a2 = self.att2.id url1 = "/interaction/attachment/{0}/download/".format(a1) url2 = "/interaction/attachment/{0}/download/".format(a2) #First, try attachment linked to course page self.client.login(username='******', password='******') response = self.client.get(url1) self.assertEqual(response.status_code, 302) u_att1 = UserAttachment.objects.get( user=self.user2.id, attachment=self.att1.id ) self.assertEqual(len(u_att1.hist2list()),1) #Calling get(url1) again, history should grow by one log entry response = self.client.get(url1) u_att1 = UserAttachment.objects.get( user=self.user2.id, attachment=a1 ) self.assertEqual(len(u_att1.hist2list()),2) #Second, try attachment linked to lesson page response = self.client.get(url2) self.assertEqual(response.status_code, 302) u_att2 = UserAttachment.objects.get( user=self.user2.id, attachment=a2 ) self.assertEqual(len(u_att2.hist2list()),1) #Calling get(url2) again, history should grow by one log entry response = self.client.get(url2) u_att2 = UserAttachment.objects.get( user=self.user2.id, attachment=a2 ) self.assertEqual(len(u_att2.hist2list()),2)