· 9 years ago · Feb 16, 2017, 01:17 PM
1class ProductQuerySet(models.query.QuerySet):
2
3def active(self):
4 return self.filter(active=True)
5
6class ProductManager(models.Manager):
7
8def get_queryset(self):
9 return ProductQuerySet(self.model, using=self._db)
10
11def all(self, *args, **kwargs):
12 return self.get_queryset().active()
13
14def get_related(self, instance):
15 products_one = self.get_queryset().filter(categories__in=instance.categories.all())
16 products_two = self.get_queryset().filter(default=instance.default)
17 qs = (products_one | products_two).exclude(id=instance.id).distinct()
18 return qs
19
20
21
22class Product(models.Model):
23 user = models.ForeignKey(settings.AUTH_USER_MODEL)
24 title = models.CharField(max_length=120)
25 description = models.TextField(blank=True, null=True)
26 price = models.DecimalField(decimal_places=2, max_digits=20)
27 active = models.BooleanField(default= True)
28 categories = models.ManyToManyField('Category', blank=True)
29 default = models.ForeignKey('Category', related_name='default_category', null=True, blank=True)
30
31 objects = ProductManager()
32
33 def __str__(self):
34 return self.title
35
36 def get_absolute_url(self):
37 return reverse("product_detail", kwargs={"pk": self.pk})
38
39 def get_image_url(self):
40 img = self.productimage_set.first()
41 if img :`enter code here`
42 return img.image.url
43 return img #None
44
45
46class Variation(models.Model):
47 product = models.ForeignKey(Product)
48 title = models.CharField(max_length=120)
49 price = models.DecimalField(decimal_places=2, max_digits=20)
50 sale_price = models.DecimalField(decimal_places=2, max_digits=20, null=True)
51 active = models.BooleanField(default= True)
52 inventory = models.IntegerField(default="-1",null=True, blank=True)
53
54
55 def __str__(self):
56 return self.title
57
58
59def image_upload_to_featured(instance, filename):
60 title = instance.product.title
61 slug = slugify(title)
62 basename, file_extenssion = filename.split(".")
63 new_filename = "%s-%s.%s" %(slug, instance.id, file_extenssion)
64 return "products/%s/featured/%s" %(slug, new_filename)
65
66class ProductFeatured(models.Model):
67 product = models.ForeignKey(Product)
68 image = models.ImageField(upload_to=image_upload_to_featured)
69 title = models.CharField(max_length=120, null=True, blank=True)
70 description = models.CharField(max_length=220, null=True, blank=True)
71 make_image_background = models.BooleanField(default=False)
72 text_rigth = models.BooleanField(default=False)
73 show_price = models.BooleanField(default=False)
74 active = models.BooleanField(default=True)
75
76 def __str__(self):
77 return self.product.title
78
79def home(request):
80 title = 'Sign Up Now'
81 featured_image = ProductFeatured.objects.filter(active=True).order_by("?").first()
82 products = Product.objects.all().order_by("?")[:8]
83 products2 = Product.objects.all().order_by("?")[:4]
84 categories = Category.objects.all()
85
86 form = SignUpForm(request.POST or None)
87 context = {
88 "title": title,
89 "form": form,
90 "featured_image": featured_image,
91 "products":products,
92 "products2": products2,
93 "categories": categories,
94 }
95 if form.is_valid():
96 instance = form.save(commit=False)
97 full_name = form.cleaned_data.get("full_name")
98 if not full_name:
99 full_name = "New full name"
100 instance.full_name = full_name
101 instance.save()
102 context = {
103 "title": "Thank you"
104 }
105
106 return render(request, "home.html", context)
107
108{% extends "base.html" %}
109{% load crispy_forms_tags %}
110{% load staticfiles %}
111
112{% block head_title %}Welcome | {{ block.super }}{% endblock %}
113
114<style>
115 {% block style %}
116
117 .jumbotron {
118 background-color:#5ACDFF;
119 color: #000;
120 height: 350px;
121 margin-top: -22px;
122 {% if featured_image.make_image_background %}
123 background-image:url('{{ featured_image.image.url }}');
124 background-repeat: no-repeat;
125 background-color: #000;
126 background-size: cover;
127 {% endif %}
128 }
129{% endblock %}
130</style>
131
132
133
134{% block jumbotron %}
135
136{% if featured_image %}
137 <div class="jumbotron" style="">
138 <div class="container">
139 <div class="row">
140 <div class='col-sm-12 text-center{% if featured_image.text_right %} pull-right {% endif %}'>
141 <p>
142 <a class="btn btn-lg btn-primary" href="{{ featured_image.product.get_absolute_url }}" role="button">More Details </a>
143 </p>
144 </div>
145 {% if not featured_image.make_image_background %}
146 <div class='col-sm-6' >
147 <img src="{{ featured_image.product.get_absolute_url }}" class='img-responsive' />
148 </div>
149 {% endif %}
150 </div>
151 </div>
152 </div>
153
154{% else %}
155 <div class="jumbotron">
156 <div class="container">
157 <div class="row">
158 <div class='col-sm-6'>
159 <h1>Welcome</h1>
160 <p></p>
161 </div>
162 <div class='col-sm-6' >
163
164 </div>
165 </div>
166 </div>
167 </div>
168
169{% endif %}
170{% endblock %}
171
172{% block content %}
173 <div class="container">
174 <h3>Recommended Products</h3>
175 <hr />
176 {% include "products/products.html" with object_list=products %}
177 <br />
178 <h3>Featured Products</h3>
179 <hr />
180 {% include "products/products.html" with object_list=products2 %}
181 </div>
182{% endblock %}
183
184import os
185
186BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
187
188SECRET_KEY = ''
189
190DEBUG = False
191
192ALLOWED_HOSTS = ['multi-ecommerce.herokuapp.com']
193
194EMAIL_HOST = 'smtp.gmail.com'
195EMAIL_HOST_USER = ''
196EMAIL_HOST_PASSWORD = ''
197EMAIL_PORT = 587
198EMAIL_USE_TLS = True
199EMAIL_DEBUG = False
200
201
202INSTALLED_APPS = (
203 #django app
204 'django.contrib.admin',
205 'django.contrib.auth',
206 'django.contrib.contenttypes',
207 'django.contrib.sessions',
208 'django.contrib.sites',
209 'django.contrib.messages',
210 'django.contrib.staticfiles',
211 #third party apps
212 'crispy_forms',
213 'registration',
214 'django_filters',
215 'storages',
216 #my apps
217 'newsletter',
218 'products',
219 'carts',
220 'orders',
221 'sellers',
222 )
223
224 ROOT_URLCONF = 'ecommerce2.urls'
225
226 MIDDLEWARE_CLASSES = (
227 'django.contrib.sessions.middleware.SessionMiddleware',
228 'django.middleware.common.CommonMiddleware',
229 'django.middleware.csrf.CsrfViewMiddleware',
230 'django.contrib.auth.middleware.AuthenticationMiddleware',
231 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
232 'django.contrib.messages.middleware.MessageMiddleware',
233 'django.middleware.clickjacking.XFrameOptionsMiddleware',
234 'django.middleware.security.SecurityMiddleware',
235 )
236
237 ROOT_URLCONF = 'ecommerce2.urls'
238
239TEMPLATES = [
240 {
241 'BACKEND': 'django.template.backends.django.DjangoTemplates',
242 'DIRS': [os.path.join(BASE_DIR, "templates")],
243 'APP_DIRS': True,
244 'OPTIONS': {
245 'context_processors': [
246 'django.template.context_processors.debug',
247 'django.template.context_processors.request',
248 'django.contrib.auth.context_processors.auth',
249 'django.contrib.messages.context_processors.messages',
250 ],
251 },
252 },
253 ]
254
255 WSGI_APPLICATION = 'ecommerce2.wsgi.application'
256
257DATABASES = {
258 'default': {
259 'ENGINE': 'django.db.backends.sqlite3',
260 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
261 }
262 }
263
264import dj_database_url
265db_from_env = dj_database_url.config()
266DATABASES['default'].update(db_from_env)
267
268LANGUAGE_CODE = 'en-us'
269
270TIME_ZONE = 'UTC'
271
272USE_I18N = True
273
274USE_L10N = True
275
276USE_TZ = True
277
278STATIC_ROOT = 'staticfiles'
279STATIC_URL = '/static/'
280
281STATICFILES_DIRS = (
282 os.path.join(BASE_DIR, "static_in_pro", "our_static"),
283)
284
285MEDIA_URL = '/media/'
286MEDIA_ROOT = os.path.join(BASE_DIR, "media")
287
288CRISPY_TEMPLATE_PACK = 'bootstrap3'
289
290ACCOUNT_ACTIVATION_DAYS = 7
291REGISTRATION_AUTO_LOGIN = True
292SITE_ID = 1
293LOGIN_REDIRECT_URL = '/'
294
295BRAINTREE_PUBLIC = ""
296BRAINTREE_PRIVATE = ""
297BRAINTREE_MERCHAND_ID = ""
298BRAINTREE_ENVIRONMENT = "sandbox"
299
300
301# AWS
302STATICFILES_LOCATION = 'static'
303MEDIAFILES_LOCATION = 'media'
304
305AWS_ACCESS_KEY_ID = ""
306AWS_SECRET_ACCESS_KEY = ""
307
308AWS_FILE_EXPIRE = 200
309AWS_PRELOAD_METADATA = True
310AWS_QUERYSTRING_AUTH = True
311
312DEFAULT_FILE_STORAGE = 'ecommerce2.utils.MediaRootS3BotoStorage'
313STATICFILES_STORAGE = 'ecommerce2.utils.StaticRootS3BotoStorage'
314AWS_STORAGE_BUCKET_NAME = 'multi-ecommerce'
315S3DIRECT_REGION = 'us-west-2'
316S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
317MEDIA_URL = '//%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
318MEDIA_ROOT = MEDIA_URL
319STATIC_URL = S3_URL + 'static/'
320ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
321
322import datetime
323
324two_months = datetime.timedelta(days=61)
325date_two_months_later = datetime.date.today() + two_months
326expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 GMT")
327
328AWS_HEADERS = {
329 'Expires': expires,
330 'Cache-Control': 'max-age=%d' % (int(two_months.total_seconds()), ),
331}