Merge pull request #13 from JMR-dev/jr-changes-after-building-client
Merge Basic MVP Server
@@ -10,6 +10,7 @@ pylint = "*"
|
||||
djangorestframework = "*"
|
||||
django-cors-headers = "*"
|
||||
pylint-django = "*"
|
||||
pillow = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "5ffeeb7b09a0ef77a5e8873942a61515a35e2507f3555531b633af656efd183e"
|
||||
"sha256": "43cca80f1ca29c7ea374523e670343b3d7818ab32e20b274199076e014596a6c"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
@@ -69,7 +69,7 @@
|
||||
"sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7",
|
||||
"sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.1' and python_version < '4.0'",
|
||||
"markers": "python_version < '4.0' and python_full_version >= '3.6.1'",
|
||||
"version": "==5.10.1"
|
||||
},
|
||||
"lazy-object-proxy": {
|
||||
@@ -122,6 +122,47 @@
|
||||
],
|
||||
"version": "==0.6.1"
|
||||
},
|
||||
"pillow": {
|
||||
"hashes": [
|
||||
"sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97",
|
||||
"sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049",
|
||||
"sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c",
|
||||
"sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae",
|
||||
"sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28",
|
||||
"sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030",
|
||||
"sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56",
|
||||
"sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976",
|
||||
"sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e",
|
||||
"sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e",
|
||||
"sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f",
|
||||
"sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b",
|
||||
"sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a",
|
||||
"sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e",
|
||||
"sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa",
|
||||
"sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7",
|
||||
"sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00",
|
||||
"sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838",
|
||||
"sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360",
|
||||
"sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b",
|
||||
"sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a",
|
||||
"sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd",
|
||||
"sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4",
|
||||
"sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70",
|
||||
"sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204",
|
||||
"sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc",
|
||||
"sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b",
|
||||
"sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669",
|
||||
"sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7",
|
||||
"sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e",
|
||||
"sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c",
|
||||
"sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092",
|
||||
"sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c",
|
||||
"sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5",
|
||||
"sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==9.0.1"
|
||||
},
|
||||
"platformdirs": {
|
||||
"hashes": [
|
||||
"sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d",
|
||||
@@ -164,18 +205,18 @@
|
||||
},
|
||||
"pytz": {
|
||||
"hashes": [
|
||||
"sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c",
|
||||
"sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"
|
||||
"sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7",
|
||||
"sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"
|
||||
],
|
||||
"version": "==2021.3"
|
||||
"version": "==2022.1"
|
||||
},
|
||||
"setuptools": {
|
||||
"hashes": [
|
||||
"sha256:2347b2b432c891a863acadca2da9ac101eae6169b1d3dfee2ec605ecd50dbfe5",
|
||||
"sha256:e4f30b9f84e5ab3decf945113119649fec09c1fc3507c6ebffec75646c56e62b"
|
||||
"sha256:6599055eeb23bfef457d5605d33a4d68804266e6cb430b0fb12417c5efeae36c",
|
||||
"sha256:782ef48d58982ddb49920c11a0c5c9c0b02e7d7d1c2ad0aa44e1a1e133051c96"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==60.9.3"
|
||||
"version": "==60.10.0"
|
||||
},
|
||||
"sqlparse": {
|
||||
"hashes": [
|
||||
@@ -190,7 +231,7 @@
|
||||
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
|
||||
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
|
||||
],
|
||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
|
||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==0.10.2"
|
||||
},
|
||||
"typing-extensions": {
|
||||
|
||||
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 611 KiB |
|
After Width: | Height: | Size: 863 KiB |
|
After Width: | Height: | Size: 723 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 515 KiB |
|
After Width: | Height: | Size: 549 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 712 KiB |
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 555 KiB |
|
After Width: | Height: | Size: 975 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 572 KiB |
|
After Width: | Height: | Size: 718 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 356 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 681 KiB |
|
After Width: | Height: | Size: 902 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 111 KiB |
@@ -0,0 +1,21 @@
|
||||
# Generated by Django 4.0.3 on 2022-03-18 15:30
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('smugfolioapi', '0002_rename_smug_user_id_images_smug_user_images_picture'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='images',
|
||||
name='file_name',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='images',
|
||||
name='file_path',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.0.3 on 2022-03-18 18:49
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('smugfolioapi', '0003_remove_images_file_name_remove_images_file_path'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='smug_users',
|
||||
name='business_name',
|
||||
field=models.CharField(default='Going-To-The-Sun-Photography', max_length=256),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.0.3 on 2022-03-21 20:18
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('smugfolioapi', '0004_alter_smug_users_business_name'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='images',
|
||||
name='image_tags',
|
||||
field=models.ManyToManyField(through='smugfolioapi.Image_Tag_Assignments', to='smugfolioapi.image_tags'),
|
||||
),
|
||||
]
|
||||
@@ -1,14 +1,19 @@
|
||||
from django.db import models
|
||||
from smugfolioapi.models import image_tag_assignments, image_tags, Image_Tag_Assignments
|
||||
class Images(models.Model):
|
||||
|
||||
album_id = models.IntegerField(default=0)
|
||||
image_tags = models.ManyToManyField(image_tags.Image_Tags, through=Image_Tag_Assignments)
|
||||
smug_user = models.ForeignKey("Smug_Users", on_delete=models.CASCADE)
|
||||
upload_date = models.DateTimeField(auto_now_add=True)
|
||||
file_name = models
|
||||
picture = models.ImageField(
|
||||
upload_to='smugimages', height_field=None,
|
||||
width_field=None, max_length=None, null=True
|
||||
)
|
||||
|
||||
# picture key in the table is storing the file path, not the binary data, so I don't have worry about space constraints with the 100 character limit.
|
||||
|
||||
# @property
|
||||
# def imagecount(self):
|
||||
# return self.__imagecount
|
||||
|
||||
@@ -4,7 +4,7 @@ from django.contrib.auth.models import User
|
||||
class Smug_Users(models.Model):
|
||||
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||
business_name = models.CharField(max_length=256)
|
||||
business_name = models.CharField(max_length=256, default="Going-To-The-Sun-Photography")
|
||||
business_owner = models.BooleanField(default=False)
|
||||
|
||||
|
||||
@@ -25,9 +25,11 @@ def login_user(request):
|
||||
# If authentication was successful, respond with their token
|
||||
if authenticated_user is not None:
|
||||
token = Token.objects.get(user=authenticated_user)
|
||||
smug_user= Smug_Users.objects.get(user=authenticated_user)
|
||||
data = {
|
||||
'valid': True,
|
||||
'token': token.key
|
||||
'token': token.key,
|
||||
'smug_user_id': smug_user.id
|
||||
}
|
||||
return Response(data)
|
||||
else:
|
||||
@@ -43,7 +45,6 @@ def register_user(request):
|
||||
Method arguments:
|
||||
request -- The full HTTP request object
|
||||
'''
|
||||
|
||||
# Create a new user by invoking the `create_user` helper method
|
||||
# on Django's built-in User model
|
||||
new_user = User.objects.create_user(
|
||||
@@ -56,13 +57,13 @@ def register_user(request):
|
||||
|
||||
# Now save the extra info in the levelupapi_smug_users table
|
||||
smug_users = Smug_Users.objects.create(
|
||||
business_name=request.data['business_name'],
|
||||
business_owner=request.data['business_owner'],
|
||||
|
||||
user=new_user
|
||||
|
||||
)
|
||||
|
||||
# Use the REST Framework's token generator on the new user account
|
||||
token = Token.objects.create(user=smug_users.user)
|
||||
# Return the token to the client
|
||||
data = { 'token': token.key }
|
||||
data = { 'token': token.key, 'id': smug_users.id }
|
||||
return Response(data, status=201)
|
||||
|
||||
@@ -3,7 +3,6 @@ from rest_framework.viewsets import ViewSet
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import serializers, status
|
||||
from smugfolioapi.models import Images, Smug_Users
|
||||
from PIL import Image
|
||||
import uuid
|
||||
import base64
|
||||
from django.core.files.base import ContentFile
|
||||
@@ -49,17 +48,15 @@ class ImageView(ViewSet):
|
||||
Response -- JSON serialized images instance
|
||||
"""
|
||||
# object must be retrived when using a foreign key
|
||||
format, imgstr = request.data["picture"].split(';base64,')
|
||||
file_name = request.query_params.get('file_name', None)
|
||||
format, imgstr = request.data['picture'].split(';base64,')
|
||||
ext = format.split('/')[-1]
|
||||
data = ContentFile(base64.b64decode(imgstr), name=f'{request.data["picture"]}-{uuid.uuid4()}.{ext}')
|
||||
data = ContentFile(base64.b64decode(imgstr), name=f'{file_name}-{uuid.uuid4()}.{ext}')
|
||||
smug_user = Smug_Users.objects.get(user=request.auth.user)
|
||||
images = Images.objects.create(
|
||||
file_name=request.data["file_name"],
|
||||
file_path=request.data["file_path"],
|
||||
album_id=request.data["album_id"],
|
||||
picture= data,
|
||||
smug_user= smug_user,
|
||||
upload_date = request.data["upload_date"]
|
||||
)
|
||||
serializer = ImagesSerializer(images)
|
||||
return Response(serializer.data, status=201)
|
||||
@@ -72,12 +69,8 @@ class ImageView(ViewSet):
|
||||
"""
|
||||
# Refactor keys to match ERD
|
||||
images = Images.objects.get(pk=pk)
|
||||
images.file_name = request.data["file_name"]
|
||||
images.file_path = request.data["file_path"]
|
||||
images.album_id = request.data["album_id"]
|
||||
images.smug_user_id = request.data["smug_user_id"]
|
||||
images.upload_date = request.data["upload_date"]
|
||||
images.save()
|
||||
images.image_tags.set(request.data["image_tags"])
|
||||
|
||||
|
||||
return Response(None, status=status.HTTP_204_NO_CONTENT)
|
||||
def destroy(self, request, pk):
|
||||
@@ -100,7 +93,7 @@ class ImagesSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
class Meta:
|
||||
model = Images
|
||||
fields = ('id', 'file_name', 'file_path', 'album_id', 'smug_user_id', 'upload_date', 'picture', 'imagecount')
|
||||
fields = ('id', 'album_id', 'smug_user_id', 'upload_date', 'picture')
|
||||
depth = 2
|
||||
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ class Smug_UsersSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
class Meta:
|
||||
model = Smug_Users
|
||||
fields = ('id', 'business_name', 'business_owner')
|
||||
fields = ('id', 'business_name', 'business_owner', 'user')
|
||||
depth = 2
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ from django.urls import path
|
||||
from django.conf.urls.static import static
|
||||
from smugfolioapi.views.image_tags import ImageTagsView
|
||||
from smugfolioapi.views.images import ImageView
|
||||
from smugfolioserver import settings, MEDIA_ROOT, MEDIA_URL
|
||||
from django.conf import settings
|
||||
|
||||
router = routers.DefaultRouter(trailing_slash=False)
|
||||
router.register(r'images', ImageView, 'image')
|
||||
|
||||