From f94fc49d9a967191d08228d09cf2eebbf90faed2 Mon Sep 17 00:00:00 2001 From: Zairiel Sarausad Date: Wed, 30 May 2018 16:13:41 +0800 Subject: [PATCH 1/6] Create models for Products --- livestream/models.py | 58 +++++++++++++++++++++++++++++++++++++------- profiles/models.py | 7 ++++++ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/livestream/models.py b/livestream/models.py index e1f2fb71..d6ee94e9 100644 --- a/livestream/models.py +++ b/livestream/models.py @@ -1,12 +1,5 @@ from django.db import models - - -# Stores newly generated session id -class Session(models.Model): - session_id = models.CharField(max_length=1000) - - def __str__(self): - return self.session_id +from django.contrib.auth.models import User # Stores newly generated arhive id @@ -16,4 +9,51 @@ class Archive(models.Model): def __str__(self): return self.archive_id -# Create your models here. + +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='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/profiles/models.py b/profiles/models.py index 5bcb114a..c14d9707 100644 --- a/profiles/models.py +++ b/profiles/models.py @@ -30,3 +30,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() From e5cb49bab0fa2320e0dce72a553ffe75e617be1c Mon Sep 17 00:00:00 2001 From: Zairiel Sarausad Date: Thu, 31 May 2018 14:34:51 +0800 Subject: [PATCH 2/6] Remove migrations from gitignore --- .gitignore | 6 ------ livestream/models.py | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 90776815..ec915e93 100644 --- a/.gitignore +++ b/.gitignore @@ -48,9 +48,3 @@ local_settings.py assets/ Downloads/ - -app/tags/migrations/ -profiles/migrations/ -livestream/migrations/ - - diff --git a/livestream/models.py b/livestream/models.py index d6ee94e9..0cbebdda 100644 --- a/livestream/models.py +++ b/livestream/models.py @@ -33,7 +33,7 @@ class Bid(models.Model): class Session(models.Model): auctioneer = models.OneToOneField(User, on_delete=models.CASCADE, - related_name='auctioneer') + related_name='current_auctioneer') # not sure attendees = models.ForeignKey(User, From 11c3880128aaf95cba1808ab8c86ee983f8a75a7 Mon Sep 17 00:00:00 2001 From: Zairiel Sarausad Date: Tue, 5 Jun 2018 20:28:13 +0800 Subject: [PATCH 3/6] Enable add credits --- index.html | 5 ++-- login/views.py | 4 ++- .../migrations/0005_auto_20180604_0901.py | 19 ++++++++++++++ profiles/models.py | 16 ++++++++++-- profiles/urls.py | 3 ++- profiles/views.py | 20 +++++++++++++-- src/components/PagesNavigation.vue | 25 ++++++++++++++++++- src/components/VLoginForm.vue | 1 + src/main.js | 1 + src/store/index.js | 10 +++++--- templates/index.html | 5 ++-- 11 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 profiles/migrations/0005_auto_20180604_0901.py 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/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..76a0d277 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', 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..7175a831 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,18 @@ 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')) + + print(total_credit) + + return JsonResponse({'total_credit': total_credit}) diff --git a/src/components/PagesNavigation.vue b/src/components/PagesNavigation.vue index 18a5ecaf..289eface 100644 --- a/src/components/PagesNavigation.vue +++ b/src/components/PagesNavigation.vue @@ -19,6 +19,10 @@ {{currentRoute}} +

+ Credits: {{credits}} + + +

{ + 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..53fb0f97 100644 --- a/src/components/VLoginForm.vue +++ b/src/components/VLoginForm.vue @@ -46,6 +46,7 @@ this.$store.commit('authenticated', true) this.$store.commit('setUsername', this.user.name) this.$store.commit('asAuctioneer', response.data.isAuctioneer) + this.$store.commit('addCredits', response.data.credits) this.$router.push({ name: 'Home', params: { diff --git a/src/main.js b/src/main.js index 27d4b90d..0657af1c 100644 --- a/src/main.js +++ b/src/main.js @@ -26,6 +26,7 @@ Vue.config.productionTip = false store.commit('authenticated', window.__INITIAL_STATE__.isAuthenticated) store.commit('setUsername', window.__INITIAL_STATE__.username) store.commit('asAuctioneer', window.__INITIAL_STATE__.isAuctioneer) +store.commit('addCredits', window.__INITIAL_STATE__.credits) //store username router.beforeEach((to, from, next) => { let isAuth = store.state.isAuthenticated; diff --git a/src/store/index.js b/src/store/index.js index 4f1b9471..a1418938 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -14,7 +14,8 @@ export default new Vuex.Store({ firstname: '', avatar: '', tags: '', - isAuctioneer: false + isAuctioneer: false, + credits: 100 }, mutations: { @@ -26,7 +27,8 @@ export default new Vuex.Store({ setFirstName: (state, firstname) => state.firstname = firstname, setProfilePic: (state, image) => state.avatar = image, setTags: (state, tags) => state.tags = tags, - asAuctioneer: (state, asAuct) => state.isAuctioneer = asAuct + asAuctioneer: (state, asAuct) => state.isAuctioneer = asAuct, + addCredits: (state, amount) => state.credits = parseInt(amount) }, actions: { @@ -51,6 +53,7 @@ export default new Vuex.Store({ context.commit('setProfilePic', userDetails.avatar) context.commit('setTags', userDetails.tags) context.commit('asAuctioneer', userDetails.isAuctioneer) + context.commit('addCredits', userDetails.credit_amount) },); }, setUsername: (context, username) => { @@ -66,7 +69,8 @@ export default new Vuex.Store({ getFirstName: (state) => { return state.firstname }, getProfilePic: (state) => { return state.avatar }, getTags: (state) => { return state.tags }, - isAuctioneer: (state) => { return state.isAuctioneer } + isAuctioneer: (state) => { return state.isAuctioneer }, + getCredits: (state) => { return state.credits } } }) diff --git a/templates/index.html b/templates/index.html index 80fee50e..4d2d5e3f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,11 +8,11 @@ {% csrf_token %} From 32b46334c10f46a8c12cdf8955d6ac8472d99331 Mon Sep 17 00:00:00 2001 From: Zairiel Sarausad Date: Wed, 6 Jun 2018 14:14:25 +0800 Subject: [PATCH 4/6] Add informative pop-ups on login and add credits --- profiles/views.py | 2 - src/components/PagesNavigation.vue | 60 +++++++++++++++++++++++++++--- src/components/VLoginForm.vue | 9 ++++- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/profiles/views.py b/profiles/views.py index 7175a831..ca5db771 100644 --- a/profiles/views.py +++ b/profiles/views.py @@ -126,6 +126,4 @@ def post(self, request): profile=current_user.profile ).aggregate(Sum('credit_amount')) - print(total_credit) - return JsonResponse({'total_credit': total_credit}) diff --git a/src/components/PagesNavigation.vue b/src/components/PagesNavigation.vue index 289eface..2fa9373d 100644 --- a/src/components/PagesNavigation.vue +++ b/src/components/PagesNavigation.vue @@ -21,8 +21,36 @@

Credits: {{credits}} - + -

+

+ + Add more credits? + + + + Purchase Credits + + + + + + + + + + + + + Close + Save + + + + --> - + + + + {{ alertbar.text }} + Close + @@ -99,11 +136,13 @@ export default { name: 'PagesNavigation', data(){ return { + dialog: false, showNav: false, currentRoute: "", toolbarIcon: "menu", username: "", current_credits: "", + add_credits: "", pages: [ { title: "Home", @@ -120,6 +159,13 @@ export default { }, ], + alertbar: { + snackbar: false, + y:'top', + x: null, + text: '', + timeout: 4000, + }, warningModal: false, } }, @@ -167,9 +213,11 @@ export default { // 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', 500) + formdata.set('amount', this.add_credits) request.post("/profile/update_credits/", formdata, (response)=>{ this.$store.commit('addCredits', response.data.total_credit.credit_amount__sum) diff --git a/src/components/VLoginForm.vue b/src/components/VLoginForm.vue index 53fb0f97..8cbd723b 100644 --- a/src/components/VLoginForm.vue +++ b/src/components/VLoginForm.vue @@ -1,5 +1,8 @@ -