diff --git a/auction/settings.py b/auction/settings.py index fafc0313..32987df0 100644 --- a/auction/settings.py +++ b/auction/settings.py @@ -37,6 +37,7 @@ 'profiles', 'tags', 'livestream', + 'browse', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/auction/urls.py b/auction/urls.py index 98ffc99a..e18d7091 100644 --- a/auction/urls.py +++ b/auction/urls.py @@ -28,6 +28,7 @@ path('livestream/', include('livestream.urls')), path('admin/', admin.site.urls), path('profile/', include('profiles.urls')), + path('browse/', include('browse.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += [ diff --git a/browse/__init__.py b/browse/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/browse/admin.py b/browse/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/browse/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/browse/apps.py b/browse/apps.py new file mode 100644 index 00000000..e4f56778 --- /dev/null +++ b/browse/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class BrowseConfig(AppConfig): + name = 'browse' diff --git a/browse/migrations/__init__.py b/browse/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/browse/models.py b/browse/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/browse/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/browse/tests.py b/browse/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/browse/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/browse/urls.py b/browse/urls.py new file mode 100644 index 00000000..1e8c91d5 --- /dev/null +++ b/browse/urls.py @@ -0,0 +1,9 @@ +from django.contrib import admin +from django.urls import path, include + +from . import views + +app_name = 'browse' +urlpatterns = [ + path('', views.BrowseView.as_view(), name='search'), +] diff --git a/browse/views.py b/browse/views.py new file mode 100644 index 00000000..76bec549 --- /dev/null +++ b/browse/views.py @@ -0,0 +1,47 @@ +import json +from profiles.models import Profile +from django.http import HttpResponse +from django.views.generic import View +from django.db.models import Q + + +class BrowseView(View): + def post(self, request): + print(request.POST) + query_name = request.POST.get('browseQuery', None) + query_filter = request.POST.get('browseFilter', None) + query_set = Profile.objects.all() + + print(query_name) + print(query_filter) + if query_filter and not query_name: + print("not query_filter and query_name") + query_set = query_set.filter( + tags__name__contains=query_filter).distinct() + elif not query_filter and query_name: + print("query_filter and not query_name") + query_set = query_set.filter( + Q(user__first_name__contains=query_name) | + Q(user__last_name__contains=query_name)).distinct() + else: + print("all") + query_set = query_set.filter( + Q(user__first_name__contains=query_name) | + Q(user__last_name__contains=query_name), + tags__name__contains=query_filter).distinct() + + context = [] + for obj in query_set: + tags = list(obj.tags_set.values_list('name', flat=True)) + context.append({ + 'pk': obj.user.pk, + 'username': obj.user.username, + 'last_name': obj.user.last_name, + 'first_name': obj.user.first_name, + 'description': obj.biography, + 'contact_number': obj.contact_number, + 'isAuctioneer': obj.isAuctioneer, + 'tags': tags, + }) + + return HttpResponse(json.dumps(context)) diff --git a/index.html b/index.html index a040a046..301ceeac 100644 --- a/index.html +++ b/index.html @@ -8,11 +8,11 @@
{% csrf_token %} diff --git a/livestream/models.py b/livestream/models.py index 98282e94..a15fca7e 100644 --- a/livestream/models.py +++ b/livestream/models.py @@ -22,10 +22,59 @@ class Session(models.Model): def __str__(self): return self.session_id - + # Stores newly generated arhive id class Archive(models.Model): archive_id = models.CharField(max_length=1000) def __str__(self): return self.archive_id + + +class Product(models.Model): + owner = models.OneToOneField(User, + on_delete=models.CASCADE, + related_name='product') + + name = models.CharField(max_length=30) + description = models.CharField(max_length=500) + date_sold = models.DateTimeField() + price = models.PositiveIntegerField() + winning_bid = models.PositiveIntegerField() + minimum_price = models.PositiveIntegerField() + + +class Bid(models.Model): + owner = models.OneToOneField(User, + on_delete=models.CASCADE) + credits = models.PositiveIntegerField() + + +# Stores newly generated session id +class Session(models.Model): + auctioneer = models.OneToOneField(User, + on_delete=models.CASCADE, + related_name='current_auctioneer') + + # not sure + attendees = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name='attendee') + + products = models.ForeignKey(Product, + on_delete=models.CASCADE, + related_name='product') + + bid = models.OneToOneField(Bid, + on_delete=models.CASCADE, + related_name='bid') + + session_id = models.CharField(max_length=1000) + name = models.CharField(max_length=30) + description = models.CharField(max_length=500) + date_when = models.DateTimeField() + date_live = models.DateTimeField() + isOngoing = models.BooleanField(default=False) + + def __str__(self): + return self.session_id diff --git a/login/views.py b/login/views.py index 4daabeb9..9c1d1f36 100644 --- a/login/views.py +++ b/login/views.py @@ -13,9 +13,11 @@ def post(self, request): if user is not None: auth.login(request, user) isAuctioneer = user.profile.isAuctioneer + credits = user.profile.total_credits return JsonResponse({'isValid': True, - 'isAuctioneer': isAuctioneer}) + 'isAuctioneer': isAuctioneer, + 'credits': credits}) else: return HttpResponseBadRequest() diff --git a/profiles/migrations/0005_auto_20180604_0901.py b/profiles/migrations/0005_auto_20180604_0901.py new file mode 100644 index 00000000..116af282 --- /dev/null +++ b/profiles/migrations/0005_auto_20180604_0901.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.4 on 2018-06-04 09:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('profiles', '0004_auto_20180604_0820'), + ] + + operations = [ + migrations.AlterField( + model_name='product', + name='bid', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bid', to='profiles.Bid'), + ), + ] diff --git a/profiles/models.py b/profiles/models.py index bc6979c1..a70af6c6 100644 --- a/profiles/models.py +++ b/profiles/models.py @@ -1,5 +1,6 @@ from django.db import models from django.contrib.auth.models import User +from django.db.models import Sum class Bid(models.Model): @@ -29,8 +30,14 @@ def countSubscribers(self): """Returns how many subscribers are currently subscribed to a user""" return self.user.auctioneer.count() + @property + def total_credits(self): + total_credits = self.credit_profile.aggregate( + Sum('credit_amount')) + return total_credits['credit_amount__sum'] + def __str__(self): - return str(self.user.username) + return '{}'.format(self.user.username) class Credit(models.Model): @@ -40,12 +47,17 @@ class Credit(models.Model): on_delete=models.CASCADE, null=True) + def __str__(self): + return '{} {}'.format(self.profile.user.username, + self.credit_amount) + class Product(models.Model): bid = models.ForeignKey(Bid, related_name='bid', on_delete=models.CASCADE, - null=True) + null=True, + blank=True) profile = models.ForeignKey(Profile, related_name='product_profile', @@ -71,3 +83,10 @@ class Subscribed(models.Model): bidder = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bidder') + + +class Credits(models.Model): + owner = models.OneToOneField(User, + on_delete=models.CASCADE, + related_name='credits') + credits = models.PositiveIntegerField() diff --git a/profiles/urls.py b/profiles/urls.py index f67ebf2a..18550acd 100644 --- a/profiles/urls.py +++ b/profiles/urls.py @@ -7,5 +7,6 @@ path('edit_profile_details/', views.EditProfile.as_view()), path('edit_password/', views.EditPassword.as_view()), path('remove_tag/', views.TagRemoval.as_view()), - path('subscribe/', views.Subscribe.as_view()) + path('subscribe/', views.Subscribe.as_view()), + path('update_credits/', views.UpdateCredits.as_view()) ] diff --git a/profiles/views.py b/profiles/views.py index 359b9f06..ca5db771 100644 --- a/profiles/views.py +++ b/profiles/views.py @@ -3,7 +3,8 @@ from django.views.generic import View from django.http import HttpResponse from tags.models import Tags -from profiles.models import Subscribed +from profiles.models import Subscribed, Credit +from django.db.models import Sum class ProfileView(View): @@ -26,7 +27,7 @@ def post(self, request): 'isAuctioneer': user_profile.isAuctioneer, 'subscribers': user_profile.countSubscribers, 'hasSubscribed': hasSubscribed, - 'contact_number': user.profile.contact_number + 'contact_number': user.profile.contact_number, } return JsonResponse(context) @@ -113,3 +114,16 @@ def post(self, request): subscribed_user.profile.save() return HttpResponse(res) + + +class UpdateCredits(View): + def post(self, request): + current_user = request.user + amount = request.POST.get('amount', '') + credit = Credit.objects.create(credit_amount=amount, + profile=current_user.profile) + total_credit = Credit.objects.filter( + profile=current_user.profile + ).aggregate(Sum('credit_amount')) + + return JsonResponse({'total_credit': total_credit}) diff --git a/src/assets/js/Request.js b/src/assets/js/Request.js index 31011acd..fbd27d4a 100644 --- a/src/assets/js/Request.js +++ b/src/assets/js/Request.js @@ -22,6 +22,6 @@ export default class Request { } get(url, callback){ - this.send('get',baseurl, url, callback); + this.send('get', url, {}, callback); } } \ No newline at end of file diff --git a/src/components/Explore.vue b/src/components/Explore.vue new file mode 100644 index 00000000..ec7bcb0b --- /dev/null +++ b/src/components/Explore.vue @@ -0,0 +1,151 @@ + +{{result.username}}
++ Credits: {{credits}} +
+Browse
+