From cf240c4460812136d49473c83537fd0326913ddc Mon Sep 17 00:00:00 2001
From: anurag singh <140162738+anurag6569201@users.noreply.github.com>
Date: Sat, 8 Jun 2024 02:07:45 +0900
Subject: [PATCH] fixed the issue fixes #142
---
.../core/__pycache__/forms.cpython-312.pyc | Bin 0 -> 1104 bytes
.../core/__pycache__/urls.cpython-312.pyc | Bin 1287 -> 1247 bytes
.../core/__pycache__/views.cpython-312.pyc | Bin 10399 -> 11549 bytes
newsaggregator/core/forms.py | 8 +
newsaggregator/core/urls.py | 3 +-
newsaggregator/core/views.py | 188 +++++++++++-------
newsaggregator/static/assets/css/style.css | 104 ++++------
newsaggregator/static/assets/js/preloader.js | 3 +-
.../templates/components/footer.html | 27 +--
newsaggregator/templates/core/about.html | 2 +-
newsaggregator/templates/core/contact.html | 47 ++---
.../templates/{core => partials}/base.html | 0
.../templates/userauths/sign-in.html | 2 +-
.../templates/userauths/sign-up.html | 2 +-
14 files changed, 181 insertions(+), 205 deletions(-)
create mode 100644 newsaggregator/core/__pycache__/forms.cpython-312.pyc
create mode 100644 newsaggregator/core/forms.py
rename newsaggregator/templates/{core => partials}/base.html (100%)
diff --git a/newsaggregator/core/__pycache__/forms.cpython-312.pyc b/newsaggregator/core/__pycache__/forms.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..291412b39e4eb59a5badd29176b9029fc6f647e4
GIT binary patch
literal 1104
zcmZ`&O-LI-6rRbS`B~EzN@=YI4>1ryg<=t`KS+$J1*4>v>UMEicgIcaW;dPP;13im
zc+ivf{uD-#SqI2rdTB6E42Heh>5hl|VXpLX9+Z
zg9`>OoALz>fTo6VIz;}y0}$Y$0(hSfApc_cGSR~dWD!>L)u`fA{3W;-*d;o2?FDyz
z9^ykRC+=C7cjmu)+2diN6}qC;bgs%rSkC?HIn4jyx}Ru;Z_(md&JCwz{+1iHBDZM8
zSEA{d8_O8FCCSzp>GR1yBH+dKsEeW-
z6~(flR5gk@QG8dGG%tebWVn$`QNm*-q$zG>8ZBGndZlW)0ZMVB?6+Rf!(KFqXgMx7
zu3Jb&jqI3LN`q0M)wyA+C}AYIO)}{R(ycGxly>v1km(m*nFyQ0h+f5#+HRI~wJ3}t
z^Q~o6gnah(%dU}Ju8_@*OivcNrV5iUvYBZ?M@!^{Dn_bg8CZ}Fj085y-IWzgUkTgj
zGcdQwwhoSCEgMg_hBt?6@_x^L$G4uZJ%?@fjBGzwoF~YMEv$_mbFCZMBd)d1wc5$v
zTJ|W}TTk{LOdJl_&t{zDti$nZ*<&t2Nr^g_uv2|Cbd>6=r}_@w+j+?zns-vN!zqLn
zZ`(jy#->r5tG)U>_i656@UYwNpLIHTC;sL`4%1O$CFausH>4~|x@vg$5TKLd9pMor
tG3H}}&cXxU{SDy+G3lc+Y4EonLiiIr{1Xa50d9Bfbbjpo3n*r}{{iVK4b%Vt
literal 0
HcmV?d00001
diff --git a/newsaggregator/core/__pycache__/urls.cpython-312.pyc b/newsaggregator/core/__pycache__/urls.cpython-312.pyc
index c433b9fb62ab68521ddb2ea414543950e89730d3..8999bbd65967659a9ed8205a34e9195eebbe3b5b 100644
GIT binary patch
delta 464
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
delta 4344
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
LsMP`=V*C9Mk8>Bb
diff --git a/newsaggregator/core/forms.py b/newsaggregator/core/forms.py
new file mode 100644
index 0000000..df709f6
--- /dev/null
+++ b/newsaggregator/core/forms.py
@@ -0,0 +1,8 @@
+from django import forms
+
+
+class ContactForm(forms.Form):
+ name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': 'Your Name'}))
+ email = forms.EmailField(widget=forms.EmailInput(attrs={'placeholder': 'Your Email'}))
+ phone = forms.IntegerField(widget=forms.NumberInput(attrs={'placeholder': 'Your Phone Number'}))
+ content = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Your Message'}))
\ No newline at end of file
diff --git a/newsaggregator/core/urls.py b/newsaggregator/core/urls.py
index d6dd3d2..24fc00b 100644
--- a/newsaggregator/core/urls.py
+++ b/newsaggregator/core/urls.py
@@ -1,6 +1,5 @@
from django.urls import path
from core import views
-from .views import submit_contact
# from .views import base_view
from .views import news_list
@@ -12,7 +11,7 @@
# path('base/', base_view, name='base'),
path('',views.news_list,name='index'),
path('about/', views.about, name='about'),
- path('contact.html/',views.submit_contact,name='contact'),
+ path('contact/',views.contact,name='contact'),
path('advertise/',views.advertise,name='advertise'),
path('privacy/',views.privacy,name='privacy'),
diff --git a/newsaggregator/core/views.py b/newsaggregator/core/views.py
index e021ac0..0e38f88 100644
--- a/newsaggregator/core/views.py
+++ b/newsaggregator/core/views.py
@@ -1,90 +1,95 @@
-# your_app/views.py
-
-from django.shortcuts import render, redirect, get_object_or_404
-from django.http import JsonResponse
-from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
-from .models import Headline, Bookmark, Rating, Contact
from django.contrib import messages
-from .decorators import custom_login_required # Import the custom decorator
+from django.contrib.auth.decorators import login_required
+from django.http import HttpResponse, JsonResponse
+from django.shortcuts import render
+
+from django.shortcuts import render
import requests
+from django.shortcuts import render, redirect
from bs4 import BeautifulSoup as BSoup
+from core.models import Headline
+
+from datetime import datetime
+from core.forms import ContactForm
+from django.template.loader import render_to_string
+from django.core.mail import send_mail
+
+
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render, redirect, get_object_or_404
+from core.models import Headline, Bookmark
+from django.contrib import messages
from django.views.decorators.csrf import csrf_exempt
-import json
-# def base_view(request):
-# return render(request, 'core/base.html')
-@custom_login_required
+from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
+#view for scraping new
+
def scrape(request, name):
- Headline.objects.all().delete()
+ Headline.objects.all().delete() #remove all existing records from table
session = requests.Session()
+ #useragent helps server to identify origin of request
+ #we are imitating request as google bot
session.headers = {"User-Agent": "Googlebot/2.1 (+http://www.google.com/bot.html)"}
+ #google bot is crawler program
+ #session.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
url = f"https://www.theonion.com/{name}"
content = session.get(url).content
+ #print(content)#raw content
soup = BSoup(content, "html.parser")
+ #print(soup)
+ # finding all new div using common class
News = soup.find_all("div", {"class": "sc-cw4lnv-13 hHSpAQ"})
+ print(News)
for article in News:
+ #extracting news link,img url,title for each news
main = article.find_all("a", href=True)
linkx = article.find("a", {"class": "sc-1out364-0 dPMosf js_link"})
link = linkx["href"]
titlex = article.find("h2", {"class": "sc-759qgu-0 cvZkKd sc-cw4lnv-6 TLSoz"})
title = titlex.text
imgx = article.find("img")["data-src"]
+ #storing extracted data to model
new_headline = Headline()
new_headline.title = title
new_headline.url = link
new_headline.image = imgx
new_headline.save()
+ #saving details to table
return redirect("../")
-# @custom_login_required
-# def news_list(request):
-# headlines = Headline.objects.all().order_by('-id')
-# swiper = Headline.objects.all()[:4]
-# user_bookmarked_headline_ids = []
-# if request.user.is_authenticated:
-# user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True)
-# page = request.GET.get('page', 1)
-# num_of_items = 9
-# paginator = Paginator(headlines, num_of_items)
-# try:
-# headlines_obj = paginator.page(page)
-# except PageNotAnInteger:
-# headlines_obj = paginator.page(1)
-# except EmptyPage:
-# headlines_obj = paginator.page(paginator.num_pages)
-# context = {
-# "object_list": headlines_obj,
-# "paginator": paginator,
-# 'swiper': swiper,
-# 'user_bookmarked_headline_ids': user_bookmarked_headline_ids,
-# }
-# return render(request, "core/index.html", context)
-from django.shortcuts import render
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-from .models import Headline
-
+@login_required(login_url='userauths:sign-in')
def news_list(request):
+ # Fetch all headlines in reverse order
headlines = Headline.objects.all().order_by('-id')
swiper = Headline.objects.all()[:4]
+
+ # Get the list of bookmarked headline IDs for the current user
+ user_bookmarked_headline_ids = []
+ if request.user.is_authenticated:
+ user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True)
+
+ # Pagination logic
page = request.GET.get('page', 1)
num_of_items = 9
paginator = Paginator(headlines, num_of_items)
+
try:
headlines_obj = paginator.page(page)
except PageNotAnInteger:
headlines_obj = paginator.page(1)
except EmptyPage:
headlines_obj = paginator.page(paginator.num_pages)
+
context = {
"object_list": headlines_obj,
"paginator": paginator,
'swiper': swiper,
+ 'user_bookmarked_headline_ids': user_bookmarked_headline_ids,
}
return render(request, "core/index.html", context)
-
-@custom_login_required
+@login_required(login_url='userauths:sign-in')
def index(request):
Headline.objects.all().delete()
session = requests.Session()
@@ -92,71 +97,101 @@ def index(request):
url = f"https://www.theonion.com/latest"
content = session.get(url).content
soup = BSoup(content, "html.parser")
+
News = soup.find_all("div", {"class": "sc-cw4lnv-13 hHSpAQ"})
- count = 0
+ count=0
for article in News:
- count += 1
- if count <= 8:
+ count=count+1
+
+ if count<=8:
main = article.find_all("a", href=True)
+
linkx = article.find("a", {"class": "sc-1out364-0 dPMosf js_link"})
link = linkx["href"]
+
titlex = article.find("h2", {"class": "sc-759qgu-0 cvZkKd sc-cw4lnv-6 TLSoz"})
title = titlex.text
+
imgx = article.find("img")["data-src"]
+
new_headline = Headline()
new_headline.title = title
new_headline.url = link
new_headline.image = imgx
- new_headline.save()
+ new_headline.save() ##saving each record to news_headline
+
headlines = Headline.objects.all()[::-1]
context = {
"object_list": headlines,
}
return render(request, "core/index.html", context)
-# @custom_login_required
+
def about(request):
- context = {}
+ context={
+
+ }
return render(request, "core/about.html", context)
-# @custom_login_required
-def submit_contact(request):
- if request.method == 'POST':
- name = request.POST.get('name')
- email = request.POST.get('email')
- phone = request.POST.get('phone')
- message = request.POST.get('message')
- contact = Contact()
- contact.name = name
- contact.email = email
- contact.phone = phone
- contact.message = message
- contact.save()
- messages.success(request, "Thanks for contacting us")
- return redirect("/contact.html")
- return render(request, "core/contact.html")
-# @custom_login_required
+def contact(request):
+ today_date = datetime.now().strftime('%Y-%m-%d')
+ if request.method == "POST":
+ form = ContactForm(request.POST)
+
+ if form.is_valid():
+ name = form.cleaned_data['name']
+ email = form.cleaned_data['email']
+ phone = form.cleaned_data['phone']
+ content = form.cleaned_data['content']
+
+ html = render_to_string('components/email.html', {
+ 'name': name,
+ 'email': email,
+ 'phone': phone,
+ 'content': content,
+ })
+
+ send_mail("The contact form subject", 'this is the message', email, ['email@gmail.com'], html_message=html)
+ messages.success(request, 'Form submitted successfully!')
+ return redirect("core:index")
+ else:
+ form = ContactForm()
+
+ context={
+ 'today_date': today_date,
+ 'form': form,
+ }
+ return render(request,"core/contact.html",context)
+
+@login_required(login_url='userauths:sign-in')
def advertise(request):
- context = {}
+ context={
+
+ }
return render(request, "core/advertise.html", context)
-# @custom_login_required
+@login_required(login_url='userauths:sign-in')
def privacy(request):
- context = {}
+ context={
+
+ }
return render(request, "core/privacy.html", context)
-# @custom_login_required
+
+@login_required
def view_bookmarks(request):
+ # Get the list of bookmarked headline IDs for the current user
+ user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True)
bookmarks = Bookmark.objects.filter(user=request.user).select_related('headline')
- if bookmarks.exists():
- context = {'bookmarks': bookmarks}
- else:
- context = {'message': 'You have no bookmarks yet.'}
+ context = {
+ 'bookmarks': bookmarks,
+ 'user_bookmarked_headline_ids': user_bookmarked_headline_ids,
+ }
return render(request, 'core/bookmarks.html', context)
@csrf_exempt
-# @custom_login_required
+@login_required(login_url='userauths:sign-in')
def bookmark_article(request, headline_id):
if request.method == 'POST':
headline = get_object_or_404(Headline, id=headline_id)
@@ -165,15 +200,14 @@ def bookmark_article(request, headline_id):
return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)
@csrf_exempt
-# @custom_login_required
+@login_required(login_url='userauths:sign-in')
def remove_bookmark(request, headline_id):
if request.method == 'POST':
Bookmark.objects.filter(user=request.user, headline_id=headline_id).delete()
return JsonResponse({'status': 'success'})
return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)
-import json
-# @custom_login_required
+
@csrf_exempt
def rate_headline(request, headline_id):
if request.method == 'POST':
@@ -205,3 +239,5 @@ def top_rated_articles(request):
top_rated_articles = Headline.objects.filter(average_rating__gte=3.5).order_by('-average_rating')
paginator = Paginator(top_rated_articles, 9)
page = request
+
+
diff --git a/newsaggregator/static/assets/css/style.css b/newsaggregator/static/assets/css/style.css
index 63cac60..5dbb5ac 100644
--- a/newsaggregator/static/assets/css/style.css
+++ b/newsaggregator/static/assets/css/style.css
@@ -29,7 +29,6 @@
--foreground-tertiary: hsl(214, 20%, 69%);
--accent: hsl(229, 76%, 66%);
-
}
@@ -236,28 +235,7 @@ header {
header .flex-wrapper { display: none; }
-/* The navigation bar */
-.navbar {
- overflow: hidden;
- background-color: #333;
- position: fixed; /* Set the navbar to fixed position */
- top: 0; /* Position the navbar at the top of the page */
- width: 100%; /* Full width */
- z-index:1000;
-}
-
-/* Links inside the navbar */
-.navbar a {
- float: left;
- display: block;
- color: #f2f2f2;
- text-align: center;
- /* padding: 14px 16px; */
- text-decoration: none;
-}
-
-
-/* .navbar-section {
+.navbar-section {
padding-left: 3rem;
padding-right: 3rem;
border-bottom: 1px solid var(--action-primary);
@@ -270,12 +248,12 @@ header .flex-wrapper { display: none; }
align-items: center;
gap: 15px;
padding: 15px 0;
-} */
+}
.dropdown {
- padding-top: 7rem;
+ padding-top: 2rem;
padding-right: 1rem;
- padding-bottom: 1rem;
+ padding-bottom: 1rem;;
}
.logo-container {
@@ -370,9 +348,6 @@ header .btn-group {
}
-
-
-
/*-----------------------------------*\
#HERO SECTION
\*-----------------------------------*/
@@ -538,7 +513,7 @@ footer {
}
footer .footer-section {
- padding-top: 10px;
+ padding-top: 1rem;
display: flex;
justify-content: space-evenly;
grid-template-columns: 1fr;
@@ -580,7 +555,6 @@ footer .wrapper { text-align: center; }
font-size: var(--fs-4);
text-align: center;
padding-bottom: 1rem;
- background-color: blue;
/* border-top: 1px solid var(--action-primary); */
}
@@ -594,7 +568,6 @@ footer .wrapper { text-align: center; }
-
/*-----------------------------------*\
#MEDIA QUERIES
\*-----------------------------------*/
@@ -1102,42 +1075,39 @@ footer .wrapper { text-align: center; }
- /**
+ /**
* FOOTER
*/
- .footer-title { font-size: 1.125rem; }
+ .footer-title { font-size: 1.125rem; }
- .footer-link { margin-bottom: 0.3rem; }
-
-}
-/* custom css */
-.dark-theme .bio-content h2,
-.dark-theme .ck-content h1,
-.dark-theme .ck-content h2,
-.dark-theme .ck-content h3,
-.dark-theme .ck-content h4,
-.dark-theme .ck-content h5,
-.dark-theme .ck-content h6{
- color: var(--foreground-secondary);
-}
-.dark-theme .bio-content p,
-.dark-theme .ck-content p{
- color: var(--foreground-tertiary);
-}
-.light-theme .bio-content h2,
-.light-theme .ck-content h1,
-.light-theme .ck-content h2,
-.light-theme .ck-content h3,
-.light-theme .ck-content h4,
-.light-theme .ck-content h5,
-.light-theme .ck-content h6{
- color: var(--foreground-secondary);
-}
-.light-theme .bio-content p,
-.light-theme .ck-content p{
- color: var(--foreground-secondary);
-}
-.hr-container{
- background-color: blue;
-}
+ .footer-link { margin-bottom: 0.3rem; }
+
+ }
+ /* custom css */
+ .dark-theme .bio-content h2,
+ .dark-theme .ck-content h1,
+ .dark-theme .ck-content h2,
+ .dark-theme .ck-content h3,
+ .dark-theme .ck-content h4,
+ .dark-theme .ck-content h5,
+ .dark-theme .ck-content h6{
+ color: var(--foreground-secondary);
+ }
+ .dark-theme .bio-content p,
+ .dark-theme .ck-content p{
+ color: var(--foreground-tertiary);
+ }
+ .light-theme .bio-content h2,
+ .light-theme .ck-content h1,
+ .light-theme .ck-content h2,
+ .light-theme .ck-content h3,
+ .light-theme .ck-content h4,
+ .light-theme .ck-content h5,
+ .light-theme .ck-content h6{
+ color: var(--foreground-secondary);
+ }
+ .light-theme .bio-content p,
+ .light-theme .ck-content p{
+ color: var(--foreground-secondary);
+ }
\ No newline at end of file
diff --git a/newsaggregator/static/assets/js/preloader.js b/newsaggregator/static/assets/js/preloader.js
index 839c57f..c2a6093 100644
--- a/newsaggregator/static/assets/js/preloader.js
+++ b/newsaggregator/static/assets/js/preloader.js
@@ -2,9 +2,8 @@ window.addEventListener('load', function() {
const preloader = document.getElementById('preloader');
const mainContent = document.querySelector('.outer-align');
- // Add a delay before hiding the preloader
setTimeout(() => {
preloader.style.display = 'none';
mainContent.style.display = 'flex';
- }, 100); // Adjust the delay time (in milliseconds) as needed
+ }, 100);
});
diff --git a/newsaggregator/templates/components/footer.html b/newsaggregator/templates/components/footer.html
index 7e5f083..9b79382 100644
--- a/newsaggregator/templates/components/footer.html
+++ b/newsaggregator/templates/components/footer.html
@@ -15,6 +15,7 @@
© 2024 Onion News Aggregator. All rights reserved.
+
-
-
-
-
-
-
+ © Copyright 2024 Onion News
\ No newline at end of file
diff --git a/newsaggregator/templates/core/about.html b/newsaggregator/templates/core/about.html
index cb5bedd..d11fae6 100644
--- a/newsaggregator/templates/core/about.html
+++ b/newsaggregator/templates/core/about.html
@@ -1,4 +1,4 @@
-{% extends 'core/base.html' %}
+{% extends 'partials/base.html' %}
{% load static %}
{% block index %}
diff --git a/newsaggregator/templates/core/contact.html b/newsaggregator/templates/core/contact.html
index 9fab885..07fe277 100644
--- a/newsaggregator/templates/core/contact.html
+++ b/newsaggregator/templates/core/contact.html
@@ -1,4 +1,4 @@
-{% extends 'core/base.html' %}
+{% extends 'partials/base.html' %}
{% load static %}
{% block index %}
@@ -6,16 +6,10 @@
-
+
- {%for msg in messages%}
-
-
- {%endfor%}
Contact Me
@@ -27,34 +21,26 @@
Contact Me
{% csrf_token %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ {{form.email}}
+
+
+ {{form.phone}}
+
+
-
-
-
-
-
+
@@ -62,7 +48,6 @@
Contact Me
-
diff --git a/newsaggregator/templates/core/base.html b/newsaggregator/templates/partials/base.html
similarity index 100%
rename from newsaggregator/templates/core/base.html
rename to newsaggregator/templates/partials/base.html
diff --git a/newsaggregator/templates/userauths/sign-in.html b/newsaggregator/templates/userauths/sign-in.html
index 46552a0..70e8526 100644
--- a/newsaggregator/templates/userauths/sign-in.html
+++ b/newsaggregator/templates/userauths/sign-in.html
@@ -1,4 +1,4 @@
-{% extends 'core/base.html' %}
+{% extends 'partials/base.html' %}
{% load static %}
{% block authentication %}
diff --git a/newsaggregator/templates/userauths/sign-up.html b/newsaggregator/templates/userauths/sign-up.html
index a3670c4..643f89d 100644
--- a/newsaggregator/templates/userauths/sign-up.html
+++ b/newsaggregator/templates/userauths/sign-up.html
@@ -1,4 +1,4 @@
-{% extends 'core/base.html' %}
+{% extends 'partials/base.html' %}
{% load static %}
{% block authentication %}