summaryrefslogtreecommitdiff
path: root/inventory
diff options
context:
space:
mode:
authorshivam kohli <kohlishivam5522@gmail.com>2018-05-19 16:25:16 +0530
committershivam kohli <kohlishivam5522@gmail.com>2018-05-19 16:25:16 +0530
commit03c15c038ea802395734b55a965371d06e0117e3 (patch)
treef15ba2fac78846ac70282ac86f42f2f57a7d1315 /inventory
downloadcodeless-03c15c038ea802395734b55a965371d06e0117e3.tar.gz
codeless-03c15c038ea802395734b55a965371d06e0117e3.tar.bz2
codeless-03c15c038ea802395734b55a965371d06e0117e3.zip
basic login
Diffstat (limited to 'inventory')
-rw-r--r--inventory/__init__.py0
-rw-r--r--inventory/admin.py13
-rw-r--r--inventory/forms.py39
-rw-r--r--inventory/migrations/0001_initial.py77
-rw-r--r--inventory/migrations/__init__.py0
-rw-r--r--inventory/models.py99
-rw-r--r--inventory/tests.py3
-rw-r--r--inventory/views.py72
8 files changed, 303 insertions, 0 deletions
diff --git a/inventory/__init__.py b/inventory/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/inventory/__init__.py
diff --git a/inventory/admin.py b/inventory/admin.py
new file mode 100644
index 0000000..76bf7e8
--- /dev/null
+++ b/inventory/admin.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from django.contrib import admin
+from inventory.models import Product, Merchant, Order, Purchase, PaymentButton
+
+# Register your models here.
+
+admin.site.register(Product)
+admin.site.register(Merchant)
+admin.site.register(Order)
+admin.site.register(Purchase)
+admin.site.register(PaymentButton)
diff --git a/inventory/forms.py b/inventory/forms.py
new file mode 100644
index 0000000..2d32f5a
--- /dev/null
+++ b/inventory/forms.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from django import forms
+from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth.models import User
+from inventory.models import Merchant
+
+
+class SignUpForm(UserCreationForm):
+ first_name = forms.CharField(max_length=30, required=False)
+ last_name = forms.CharField(max_length=30, required=False)
+ email = forms.EmailField(max_length=254)
+
+ class Meta:
+ model = User
+ fields = (
+ 'username',
+ 'first_name',
+ 'last_name',
+ 'email',
+ 'password1',
+ 'password2',
+ )
+
+
+class MerchantDetailForm(forms.ModelForm):
+ class Meta:
+ model = Merchant
+ fields = ("address",)
+
+
+class LoginForm(forms.ModelForm):
+ class Meta:
+ model = User
+ fields = (
+ "username",
+ "password"
+ )
diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py
new file mode 100644
index 0000000..cca4181
--- /dev/null
+++ b/inventory/migrations/0001_initial.py
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+from django.conf import settings
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Merchant',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
+ ('address', models.TextField()),
+ ('pay_url', models.URLField(max_length=250, default='NULL')),
+ ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Order',
+ fields=[
+ ('order_id', models.AutoField(primary_key=True, serialize=False)),
+ ('description', models.CharField(max_length=300, blank=True, null=True)),
+ ('order_date', models.DateTimeField(auto_now=True)),
+ ('address', models.CharField(max_length=250, blank=True, null=True)),
+ ('fulfillment_url', models.URLField(default='NULL')),
+ ('merchant_id', models.ForeignKey(to='inventory.Merchant')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='PaymentButton',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
+ ('text', models.CharField(max_length=100, blank=True, null=True)),
+ ('font_size', models.CharField(max_length=50, blank=True, null=True)),
+ ('color', models.CharField(max_length=50, blank=True, null=True)),
+ ('background_color', models.CharField(max_length=50, blank=True, null=True)),
+ ('border_radius', models.CharField(max_length=50, blank=True, null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Product',
+ fields=[
+ ('product_id', models.AutoField(primary_key=True, serialize=False)),
+ ('name', models.CharField(max_length=50, blank=True, null=True)),
+ ('description', models.CharField(max_length=300, blank=True, null=True)),
+ ('price', models.IntegerField(blank=True, null=True)),
+ ('delivery_date', models.DateTimeField(auto_now=True)),
+ ('starting_inventory', models.IntegerField(blank=True, null=True)),
+ ('minimuma_required', models.IntegerField(blank=True, null=True)),
+ ('inventory_on_hand', models.IntegerField(blank=True, null=True)),
+ ('inventory_recieved', models.IntegerField(blank=True, null=True)),
+ ('inventory_shipped', models.IntegerField(blank=True, null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Purchase',
+ fields=[
+ ('purchase_id', models.AutoField(primary_key=True, serialize=False)),
+ ('description', models.CharField(max_length=300, blank=True, null=True)),
+ ('purchase_date', models.DateTimeField(auto_now=True)),
+ ('product_recieved', models.IntegerField(blank=True, null=True)),
+ ('supplier', models.CharField(max_length=50, blank=True, null=True)),
+ ('product_id', models.ManyToManyField(null=True, to='inventory.Product')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='product_id',
+ field=models.ManyToManyField(null=True, to='inventory.Product'),
+ ),
+ ]
diff --git a/inventory/migrations/__init__.py b/inventory/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/inventory/migrations/__init__.py
diff --git a/inventory/models.py b/inventory/models.py
new file mode 100644
index 0000000..4de9f1c
--- /dev/null
+++ b/inventory/models.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from django.db import models
+from django.contrib.auth.models import User
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+
+
+class Product(models.Model):
+ """ The details of the product is described in this table.
+ This table tracks the inventory of the product.
+ """
+ product_id = models.AutoField(primary_key=True)
+ name = models.CharField(max_length=50, blank=True, null=True)
+ description = models.CharField(max_length=300, blank=True, null=True)
+ price = models.IntegerField(blank=True, null=True)
+ delivery_date = models.DateTimeField(auto_now=True)
+ starting_inventory = models.IntegerField(blank=True, null=True)
+ minimuma_required = models.IntegerField(blank=True, null=True)
+ # inventory_on_hand is updated by purchase and outgoing orders.
+ inventory_on_hand = models.IntegerField(blank=True, null=True)
+ inventory_recieved = models.IntegerField(blank=True, null=True)
+ inventory_shipped = models.IntegerField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
+
+
+class Merchant(models.Model):
+ """ Extending the default Django User Model.
+ This will hold a One-To-One relationship with the existing User Model.
+ """
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ address = models.TextField()
+ pay_url = models.URLField(max_length=250, default='NULL')
+
+ def __str__(self):
+ return self.user.username
+
+
+@receiver(post_save, sender=User)
+def create_user_profile(sender, instance, created, **kwargs):
+ """ Hooking the create_user_profile method to
+ the User model, whenever a save event occurs
+ """
+ if created:
+ Merchant.objects.create(user=instance)
+
+
+@receiver(post_save, sender=User)
+def save_user_profile(sender, instance, **kwargs):
+ """ Hooking the save_user_profile method to
+ the User model, whenever a save event occurs
+ """
+ instance.Merchant.save()
+
+
+class Order(models.Model):
+ """ Details of the order customer buys is updated in this table.
+ These details will be used to make request to the Merchant Backend API
+ """
+ order_id = models.AutoField(primary_key=True)
+ product_id = models.ManyToManyField(Product, null=True)
+ description = models.CharField(max_length=300, blank=True, null=True)
+ order_date = models.DateTimeField(auto_now=True)
+ address = models.CharField(max_length=250, blank=True, null=True)
+ merchant_id = models.ForeignKey(Merchant, on_delete=models.CASCADE)
+ fulfillment_url = models.URLField(max_length=200, default='NULL')
+
+ def __str__(self):
+ return self.description
+
+
+class Purchase(models.Model):
+ """ To keep a track of the purchases the merchant makes.
+ This table is essential to update the inverntory in hand.
+ """
+ purchase_id = models.AutoField(primary_key=True)
+ product_id = models.ManyToManyField(Product, null=True)
+ description = models.CharField(max_length=300, blank=True, null=True)
+ purchase_date = models.DateTimeField(auto_now=True)
+ product_recieved = models.IntegerField(blank=True, null=True)
+ supplier = models.CharField(max_length=50, blank=True, null=True)
+
+ def __str__(self):
+ return self.description
+
+
+class PaymentButton(models.Model):
+ """ Design pattern for the payment button are stored in this table. """
+ text = models.CharField(max_length=100, blank=True, null=True)
+ font_size = models.CharField(max_length=50, blank=True, null=True)
+ color = models.CharField(max_length=50, blank=True, null=True)
+ background_color = models.CharField(max_length=50, blank=True, null=True)
+ border_radius = models.CharField(max_length=50, blank=True, null=True)
+
+ def __str__(self):
+ return self.text
diff --git a/inventory/tests.py b/inventory/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/inventory/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/inventory/views.py b/inventory/views.py
new file mode 100644
index 0000000..80be28e
--- /dev/null
+++ b/inventory/views.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from inventory.forms import SignUpForm, MerchantDetailForm, LoginForm
+from inventory.models import Merchant
+from django.contrib.auth import authenticate
+from django.contrib.auth import login as auth_login
+from django.contrib.auth import logout as auth_logout
+from django.shortcuts import get_object_or_404
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render, redirect
+from django.core.urlresolvers import resolve
+
+# Create your views here.
+
+
+@login_required
+def home(request):
+ return render(request, 'inventory/home.html')
+
+
+def signup(request):
+ if request.method == 'POST':
+ form = SignUpForm(request.POST)
+ details_form = MerchantDetailForm(request.POST)
+ if form.is_valid():
+ form.save()
+ username = form.cleaned_data.get('username')
+ raw_password = form.cleaned_data.get('password1')
+ user = authenticate(username=username, password=raw_password)
+ auth_login(request, user)
+ instance = get_object_or_404(Merchant, user=user)
+ if details_form.is_valid():
+ instance.address = details_form.cleaned_data.get('address')
+ instance.save()
+ else:
+ print("somethings wrong with the form")
+ # Redirect to a success page.
+ return redirect('home')
+ else:
+ form = SignUpForm()
+ details_form = MerchantDetailForm()
+ dictionary = {'form': form, 'details_form': details_form}
+ return render(request, 'inventory/signup.html', dictionary)
+
+
+def login(request):
+ form = LoginForm()
+ context_dict = {}
+ context_dict['form'] = form
+ error_message = ""
+ if request.method == 'POST':
+ username = request.POST['username']
+ password = request.POST['password']
+ user = authenticate(username=username, password=password)
+ if user is not None:
+ auth_login(request, user)
+ current_url = resolve(request.path_info).url_name
+ print(current_url)
+ # Redirect to a success page.
+ return redirect('home')
+ else:
+ error_message = "You are not a registered user please sign up"
+ form = LoginForm()
+ context_dict['form'] = form
+ context_dict['error_message'] = error_message
+ return render(request, 'inventory/login.html', context_dict)
+
+
+def logout(request):
+ auth_logout(request)
+ return render(request, 'inventory/index.html')