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 @@ + + + + + + diff --git a/src/components/PagesNavigation.vue b/src/components/PagesNavigation.vue index 18a5ecaf..6ddd1e7f 100644 --- a/src/components/PagesNavigation.vue +++ b/src/components/PagesNavigation.vue @@ -19,6 +19,38 @@ {{currentRoute}} +

+ Credits: {{credits}} +

+ + Add more credits? + + + + Purchase Credits + + + + + + + + + + + + + Close + Save + + + + --> - + + + + + + + search + + + + +

Browse

+
+
+
+ @@ -85,6 +133,15 @@
+ + {{ alertbar.text }} + Close + @@ -95,10 +152,13 @@ export default { name: 'PagesNavigation', data(){ return { + dialog: false, showNav: false, currentRoute: "", toolbarIcon: "menu", username: "", + current_credits: "", + add_credits: "", pages: [ { title: "Home", @@ -106,52 +166,85 @@ export default { path: { name: 'Home' }, - },{ + }, + { title: "Profile", icon: "account_box", path: { name: 'Profile', }, }, - ], + alertbar: { + snackbar: false, + y:'top', + x: null, + text: '', + timeout: 4000, + }, warningModal: false, } }, + + computed: { + credits() { + return this.$store.getters.getCredits + } + }, methods: { - route(path){ + browse() { + this.$router.push({ + name: 'Explore' + }) + }, + route(path) { let currentRoute = this.$route.name - if(path.name == "Profile"){ + if (path.name == "Profile") { path.params = { username: this.username, } } - if(path.name == currentRoute) + if (path.name == currentRoute) { this.showNav = false; - else + } else { this.$router.push(path); + } }, - navigate(){ + navigate() { if (this.toolbarIcon == "arrow_back"){ this.$router.go(-1); - }else { + } else { this.showNav = true; } }, - signOut(){ + signOut() { let request = new Request(); request.post("/login/logout/", {}, (response)=>{ this.$router.go(0); }); }, - createLive(){ + createLive() { this.$router.push({ name: 'Create-Live' }) - } + }, + addCredits() { + // this.$store.commit("addCredits", 500) + let request = new Request(); + let formdata = new FormData(); + this.dialog = !this.dialog; + this.alertbar.text = "Successfully added " + this.add_credits + " credits!"; + this.alertbar.snackbar = true; + // formdata.set('amount', this.$store.getters.getCredits) + formdata.set('amount', this.add_credits) + request.post("/profile/update_credits/", formdata, + (response)=>{ + this.$store.commit('addCredits', response.data.total_credit.credit_amount__sum) + }); + }, }, watch: { '$route' (to,from) { diff --git a/src/components/VLoginForm.vue b/src/components/VLoginForm.vue index 9620ef26..8cbd723b 100644 --- a/src/components/VLoginForm.vue +++ b/src/components/VLoginForm.vue @@ -1,5 +1,8 @@ -