-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
188 changed files
with
38,182 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
from django.contrib import admin | ||
from .models import Blog, ContactUs, NewsletterSubscriber, BookOrder | ||
|
||
# Register your models here. | ||
@admin.register(Blog) | ||
class BlogAdmin(admin.ModelAdmin): | ||
list_display = ['id', 'title', 'author', 'created_at', 'updated_at'] | ||
search_fields = ['title__contains', 'author__contains'] | ||
|
||
class Media: | ||
js = ('js/tinyinject.js',) | ||
|
||
@admin.register(ContactUs) | ||
class ContactUsAdmin(admin.ModelAdmin): | ||
list_display = ['id', 'email', 'phone', 'subject', 'created_at', 'updated_at'] | ||
search_fields = ['email__contains', 'phone__contains', 'subject__contains'] | ||
|
||
@admin.register(NewsletterSubscriber) | ||
class NewsletterSubscriberAdmin(admin.ModelAdmin): | ||
list_display = ['id', 'email', 'created_at', 'updated_at'] | ||
search_fields = ['email__contains'] | ||
|
||
@admin.register(BookOrder) | ||
class BookOrderAdmin(admin.ModelAdmin): | ||
list_display = ['id', 'name', 'email', 'phone', 'created_at', 'updated_at'] | ||
search_fields = ['email__contains'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
from django.apps import AppConfig | ||
|
||
|
||
class HomeConfig(AppConfig): | ||
default_auto_field = 'django.db.models.BigAutoField' | ||
name = 'home' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
from django.conf import settings | ||
|
||
def site(request): | ||
return {'SITE_URL': settings.SITE_URL} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
from django.db import models | ||
from django.utils.text import slugify | ||
from django.dispatch import receiver | ||
from django.db.models.signals import pre_save, post_delete | ||
|
||
# Create your models here. | ||
class Blog(models.Model): | ||
id = models.AutoField(primary_key=True) | ||
title = models.CharField(max_length=255) | ||
sub_title = models.TextField() | ||
main_image = models.ImageField(upload_to='NewsAndArticles/', blank=True, null=True) | ||
categories = models.CharField(max_length=255, blank=True, null=True) | ||
content = models.TextField() | ||
author = models.CharField(max_length=120) | ||
slug = models.CharField(unique=True, max_length=200, blank=True, null=True) | ||
created_at = models.DateField(auto_now_add=True) | ||
updated_at = models.DateField(auto_now=True) | ||
|
||
def __str__(self): | ||
return self.title | ||
|
||
def save(self, *args, **kwargs): | ||
if not self.slug: | ||
self.slug = slugify(self.title) | ||
return super(Blog, self).save(*args, **kwargs) | ||
|
||
@receiver(post_delete, sender=Blog) | ||
def post_save_blog_image(sender, instance, *args, **kwargs): | ||
""" Clean Old Image file """ | ||
try: | ||
instance.main_image.delete(save=False) | ||
except: | ||
pass | ||
|
||
@receiver(pre_save, sender=Blog) | ||
def pre_save_blog_image(sender, instance, *args, **kwargs): | ||
""" instance old image file will delete from os """ | ||
try: | ||
old_img = instance.__class__.objects.get(id=instance.id).main_image | ||
try: | ||
new_img = instance.main_image | ||
except: | ||
new_img = None | ||
if new_img != old_img: | ||
import os | ||
if os.path.exists(old_img.path): | ||
os.remove(old_img.path) | ||
except: | ||
pass | ||
|
||
class ContactUs(models.Model): | ||
id = models.AutoField(primary_key=True) | ||
name = models.CharField(max_length=150) | ||
email = models.EmailField(max_length=200) | ||
phone = models.BigIntegerField() | ||
subject = models.CharField(max_length=255) | ||
message = models.TextField() | ||
created_at = models.DateField(auto_now_add=True) | ||
updated_at = models.DateField(auto_now=True) | ||
|
||
def __str__(self): | ||
return self.name + "--" + str(self.phone) + "--" + self.subject | ||
|
||
class NewsletterSubscriber(models.Model): | ||
id = models.AutoField(primary_key=True) | ||
email = models.EmailField(max_length=200) | ||
created_at = models.DateField(auto_now_add=True) | ||
updated_at = models.DateField(auto_now=True) | ||
|
||
def __str__(self): | ||
return self.email | ||
|
||
class BookOrder(models.Model): | ||
id = models.AutoField(primary_key=True) | ||
name = models.CharField(max_length=150) | ||
email = models.EmailField(max_length=200) | ||
phone = models.BigIntegerField() | ||
payment_receipt = models.FileField(upload_to='Payment Receipts/') | ||
additional_notes_or_comments = models.TextField() | ||
created_at = models.DateTimeField(auto_now_add=True) | ||
updated_at = models.DateTimeField(auto_now=True) | ||
|
||
def __str__(self): | ||
return str(self.id) + '--' + self.name + '--' + str(self.phone) + '--' + self.email | ||
|
||
@receiver(post_delete, sender=BookOrder) | ||
def post_save_apply_now_resume(sender, instance, *args, **kwargs): | ||
""" Clean Old Image file """ | ||
try: | ||
instance.payment_receipt.delete(save=False) | ||
except: | ||
pass | ||
|
||
@receiver(pre_save, sender=BookOrder) | ||
def pre_save_apply_now_resume(sender, instance, *args, **kwargs): | ||
""" instance old image file will delete from os """ | ||
try: | ||
old_img = instance.__class__.objects.get(id=instance.id).payment_receipt | ||
try: | ||
new_img = instance.payment_receipt | ||
except: | ||
new_img = None | ||
if new_img != old_img: | ||
import os | ||
if os.path.exists(old_img.path): | ||
os.remove(old_img.path) | ||
except: | ||
pass |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
from django import template | ||
|
||
register = template.Library() | ||
|
||
@register.filter(name='split') | ||
# @stringfilter | ||
def split(string, sep): | ||
"""Return the string split by sep. | ||
Example usage: {{ value|split:"/" }} | ||
""" | ||
return string.split(sep) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from django.test import TestCase | ||
|
||
# Create your tests here. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from django.urls import path | ||
from .views import home, about, blogs, blog_post, buy_book, contact, faq, newsletter_subscriber, blog_search | ||
|
||
urlpatterns = [ | ||
path('', home, name='home'), | ||
path('about-us/', about, name='about'), | ||
path('blogs/', blogs, name='blogs'), | ||
path('blog-search/', blog_search, name='blog-search'), | ||
path('blog-post/<slug:slug>/', blog_post, name='blog-post'), | ||
path('buy-book/', buy_book, name='buy-book'), | ||
path('contact-us/', contact, name='contact'), | ||
path('frequently-asked-questions/', faq, name='faq'), | ||
path('newsletter-subscriber/', newsletter_subscriber, name='newsletter-subscriber'), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
from django.shortcuts import render, redirect | ||
from django.contrib import messages | ||
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse | ||
from .models import Blog, NewsletterSubscriber, ContactUs, BookOrder | ||
from django.core.validators import validate_email | ||
from django.core.exceptions import ValidationError | ||
from django.views.decorators.csrf import csrf_exempt | ||
from django.contrib.sites.shortcuts import get_current_site | ||
from django.db.models import Q | ||
|
||
|
||
def validate_email_address(email): | ||
try: | ||
validate_email(email) | ||
return True | ||
except ValidationError: | ||
return False | ||
|
||
# Create your views here. | ||
def home(request): | ||
return render(request, 'home/index.html') | ||
|
||
def about(request): | ||
return render(request, 'home/about.html') | ||
|
||
def blogs(request): | ||
try: | ||
left_blog = Blog.objects.all().order_by('-id')[:1][0] | ||
right_blogs = Blog.objects.all().order_by('-id')[1:3] | ||
blogs = Blog.objects.all().order_by('-id') | ||
top_three_slugs = [left_blog.slug] | ||
for i in right_blogs: | ||
top_three_slugs.append(i.slug) | ||
main_blogs = [] | ||
for i in blogs: | ||
if i.slug not in top_three_slugs: | ||
main_blogs.append(i) | ||
random_blogs = Blog.objects.all().order_by('?') | ||
other_blogs = [] | ||
for i in random_blogs: | ||
if i.slug not in top_three_slugs: | ||
other_blogs.append(i) | ||
context = { | ||
'left_blog': left_blog, | ||
'right_blogs': right_blogs, | ||
'main_blogs': main_blogs, | ||
'other_blogs': other_blogs[:4] | ||
} | ||
except Exception as e: | ||
context = { | ||
'left_blog': None, | ||
'right_blogs': [], | ||
'main_blogs': [], | ||
'other_blogs': [] | ||
} | ||
return render(request, 'home/blogs.html', context) | ||
|
||
def blog_search(request): | ||
query = request.GET.get('blog-search') | ||
context = { | ||
'query': query, | ||
} | ||
if(len(query) <= 3): | ||
messages.error(request, 'Cound not find any matches. The number of search words is too small.') | ||
elif(len(query)>= 120): | ||
messages.error(request, 'The query length is above 120. Please! make it shorter.') | ||
else: | ||
blog1 = Blog.objects.filter(title__icontains=query) | ||
blog2 = Blog.objects.filter(sub_title__icontains=query) | ||
blog3 = Blog.objects.filter(categories__icontains=query) | ||
blog4 = Blog.objects.filter(author__icontains=query) | ||
blog5 = Blog.objects.filter(content__icontains=query) | ||
blogst = blog1.union(blog2) | ||
blognd = blogst.union(blog3) | ||
blogrd = blognd.union(blog4) | ||
blogs = blogrd.union(blog5) | ||
context['blogs'] = blogs | ||
return render(request, 'home/blogsearch.html', context) | ||
|
||
def blog_post(request, slug): | ||
blog = Blog.objects.get(slug=slug) | ||
prev_blog_slug = next_blog_slug = None | ||
if Blog.objects.filter(id=blog.id-1).exists(): | ||
prev_blog_slug = Blog.objects.get(id=blog.id-1).slug | ||
if Blog.objects.filter(id=blog.id+1).exists(): | ||
next_blog_slug = Blog.objects.get(id=blog.id+1).slug | ||
|
||
blog_category_list = blog.categories | ||
print(blog_category_list) | ||
related_blogs = [] | ||
for i in blog_category_list: | ||
blog_filter = Blog.objects.filter(categories__icontains=i).order_by('-id') | ||
for j in blog_filter: | ||
if j not in related_blogs: | ||
if j.slug != blog.slug: | ||
related_blogs.append(j) | ||
other_blogs = Blog.objects.all().order_by('-id')[:4] | ||
context = { | ||
'blog' : blog, | ||
'related_blogs': related_blogs[:3], | ||
'other_blogs': other_blogs, | ||
'prev_blog_slug': prev_blog_slug, | ||
'next_blog_slug': next_blog_slug, | ||
} | ||
return render(request, 'home/blogpost.html', context) | ||
|
||
def buy_book(request): | ||
if request.method == 'POST': | ||
email = request.POST.get('email') | ||
if validate_email_address(email): | ||
phone = request.POST.get('phone') | ||
if len(phone) == 10: | ||
name = request.POST.get('name') | ||
email = request.POST.get('email') | ||
phone = request.POST.get('phone') | ||
payment_receipt = request.FILES.get('payment_receipt') | ||
additional_notes_or_comments = request.POST.get('additional_notes_or_comments') | ||
book_order = BookOrder(name=name, email=email, phone=phone, payment_receipt=payment_receipt, additional_notes_or_comments=additional_notes_or_comments) | ||
book_order.save() | ||
messages.success(request, 'Book purchased sucessfully! Your book will be delivered within 24 hours of your purchase!!') | ||
else: | ||
messages.error(request, 'Please enter a valid phone number. Thank you!') | ||
return redirect('home') | ||
else: | ||
return render(request, 'home/buybook.html') | ||
|
||
def contact(request): | ||
if request.method == 'POST': | ||
email = request.POST.get('email') | ||
if validate_email_address(email): | ||
phone = request.POST.get('phone') | ||
if len(phone) == 10: | ||
name = request.POST.get('name') | ||
subject = request.POST.get('subject') | ||
message = request.POST.get('message') | ||
contact = ContactUs(name=name, email=email, phone=phone, subject=subject, message=message) | ||
contact.save() | ||
messages.success(request, 'Your message has been sent successfully!!') | ||
else: | ||
messages.error(request, 'Please enter a valid phone number. Thank you!') | ||
return HttpResponseRedirect(request. META['HTTP_REFERER']) | ||
else: | ||
messages.error(request, 'Please enter a valid email address. Thank you!') | ||
return HttpResponseRedirect(request. META['HTTP_REFERER']) | ||
elif request.method == 'GET': | ||
return render(request, 'home/contact.html') | ||
|
||
def faq(request): | ||
return render(request, 'home/faq.html') | ||
|
||
def newsletter_subscriber(request): | ||
if request.method == 'POST': | ||
email = request.POST.get('subscribe-email') | ||
if validate_email_address(email): | ||
subscriber = NewsletterSubscriber(email=email) | ||
subscriber.save() | ||
messages.success(request, 'Thank you for subscribing Uncharted Pages') | ||
else: | ||
messages.error(request, 'Please enter a valid email address. Thank you!') | ||
return HttpResponseRedirect(request. META['HTTP_REFERER']) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#!/usr/bin/env python | ||
"""Django's command-line utility for administrative tasks.""" | ||
import os | ||
import sys | ||
|
||
|
||
def main(): | ||
"""Run administrative tasks.""" | ||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unchartedpages.settings') | ||
try: | ||
from django.core.management import execute_from_command_line | ||
except ImportError as exc: | ||
raise ImportError( | ||
"Couldn't import Django. Are you sure it's installed and " | ||
"available on your PYTHONPATH environment variable? Did you " | ||
"forget to activate a virtual environment?" | ||
) from exc | ||
execute_from_command_line(sys.argv) | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
asgiref==3.6.0 | ||
Django==4.2 | ||
Pillow==9.5.0 | ||
python-dotenv==1.0.1 | ||
sqlparse==0.4.3 | ||
tzdata==2023.3 |
Oops, something went wrong.