예제 #1
0
 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)
예제 #3
0
파일: tests.py 프로젝트: XFJH/Shakal-NG
	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)
예제 #4
0
    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')
예제 #5
0
	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)
예제 #6
0
파일: forms.py 프로젝트: XFJH/Shakal-NG
	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()
예제 #7
0
파일: tests.py 프로젝트: XFJH/Shakal-NG
	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)
예제 #8
0
    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()        
예제 #9
0
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)
예제 #10
0
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})
예제 #11
0
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)