Skip to content

Commit

Permalink
Enhance sharing functionality in post templates and add clipboard sup…
Browse files Browse the repository at this point in the history
…port
  • Loading branch information
kvdhanush06 committed Feb 9, 2025
1 parent 27c3601 commit ce37d99
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 81 deletions.
22 changes: 18 additions & 4 deletions sociasphere/dashboard/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ <h1>Posts!</h1>
{% if post.user.profile.profile_image %}
<img src="{{ post.user.profile.profile_image.url }}" width=50 height=50 class="rounded-circle" alt="{{ post.user.username }}">
{% else %}
<img src="{% static 'images/default_profile_pic.png' %}" width=50 height=50 class="rounded-circle" alt="{{ post.user.username }}">
<img src="{% static 'images/default_profile_pic.png' %}" width=50 height=50 class="rounded-circle" alt="{{ post.user.username }}">
{% endif %}
</div>
<div class="col-11">
{{ post.body }}<br/>
<small class="text-muted">
({{ post.created_at}}) By
({{ post.created_at}}) By
@{{ post.user.username }}
&nbsp;&nbsp;
{{ post.number_of_likes }}
{{ post.number_of_likes }}

{% if user in post.likes.all %}
<a href="{% url 'post_like' post.id %}">
Expand All @@ -36,7 +36,7 @@ <h1>Posts!</h1>
</a>
{% endif %}
&nbsp;&nbsp;
<a href="{% url 'post_show' post.id %}">
<a href="{% url 'post_show' post.id %}" class="share-post" data-url="{% url 'post_show' post.id %}">
<i class="fa-solid fa-share" style="color:gray"></i>
</a>
</small>
Expand All @@ -58,4 +58,18 @@ <h1>Posts!</h1>
</div>
</div>
</div>

<script>
document.querySelectorAll('.share-post').forEach(function(element) {
element.addEventListener('click', function(event) {
event.preventDefault();
const url = this.getAttribute('data-url');
navigator.clipboard.writeText(url).then(function() {
alert('URL copied to clipboard');
}, function(err) {
console.error('Could not copy text: ', err);
});
});
});
</script>
{% endblock %}
19 changes: 18 additions & 1 deletion sociasphere/dashboard/templates/show_post.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
</a>
{% endif %}
&nbsp;&nbsp;
<a href="{% url 'share_post' post.id %}">
<a href="{% url 'share_post' post.id %}" id="share-post">
<i class="fa-solid fa-share" style="color:gray"></i>
</a>
</small>
Expand All @@ -58,4 +58,21 @@
</div>
</div>

<script>
document.getElementById('share-post').addEventListener('click', function(event) {
event.preventDefault();
fetch(this.href, {
method: 'GET',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
})
.then(response => response.json())
.then(data => {
alert(data.message);
})
.catch(error => console.error('Error:', error));
});
</script>

{% endblock %}
160 changes: 84 additions & 76 deletions sociasphere/dashboard/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,23 @@
from .models import Profile, Post
from .forms import PostForm, SignUpForm, ProfilePicForm
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
from django.http import JsonResponse
from django.urls import reverse
import pyperclip


# Helper function to handle form validation and saving for edit_post

def handle_post_form(request, post):
form = PostForm(request.POST or None, instance=post)
if request.method == "POST" and form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
messages.success(request, ("Your Post Has Been Updated!"))
return redirect('home')
return form


def home(request):
Expand Down Expand Up @@ -36,20 +50,27 @@ def profile_list(request):
return redirect('home')


def unfollow(request, pk):
if request.user.is_authenticated:
# Get the profile to unfollow
profile = Profile.objects.get(user_id=pk)
# Unfollow the user
request.user.profile.follows.remove(profile)
# Save our profile
request.user.profile.save()
# Helper function to handle follow/unfollow actions

# Return message
def handle_follow_action(request, pk, action):
profile = Profile.objects.get(user_id=pk)
if action == "unfollow":
request.user.profile.follows.remove(profile)
messages.success(
request, (f"You Have Successfully Unfollowed {profile.user.username}"))
return redirect(request.META.get("HTTP_REFERER"))
request, ("You Have Successfully Unfollowed {}"
.format(profile.user.username)))
elif action == "follow":
request.user.profile.follows.add(profile)
messages.success(
request, ("You Have Successfully Followed {}"
.format(profile.user.username)))
request.user.profile.save()
return redirect(request.META.get("HTTP_REFERER"))


def unfollow(request, pk):
if request.user.is_authenticated:
return handle_follow_action(request, pk, "unfollow")
else:
messages.success(
request, ("You Must Be Logged In To View This Page..."))
Expand All @@ -58,18 +79,7 @@ def unfollow(request, pk):

def follow(request, pk):
if request.user.is_authenticated:
# Get the profile to unfollow
profile = Profile.objects.get(user_id=pk)
# Unfollow the user
request.user.profile.follows.add(profile)
# Save our profile
request.user.profile.save()

# Return message
messages.success(
request, (f"You Have Successfully Followed {profile.user.username}"))
return redirect(request.META.get("HTTP_REFERER"))

return handle_follow_action(request, pk, "follow")
else:
messages.success(
request, ("You Must Be Logged In To View This Page..."))
Expand All @@ -95,21 +105,29 @@ def profile(request, pk):
# Save the profile
current_user_profile.save()

return render(request, "profile.html", {"profile": profile, "posts": posts})
return render(request, "profile.html", {"profile": profile,
"posts": posts})
else:
messages.success(
request, ("You Must Be Logged In To View This Page..."))
return redirect('home')


# Helper function to handle followers/follows views

def handle_follow_view(request, pk, view_name):
if request.user.id == pk:
profiles = Profile.objects.get(user_id=pk)
return render(request, '{}.html'.format(view_name),
{"profiles": profiles})
else:
messages.success(request, ("That's Not Your Profile Page..."))
return redirect('home')


def followers(request, pk):
if request.user.is_authenticated:
if request.user.id == pk:
profiles = Profile.objects.get(user_id=pk)
return render(request, 'followers.html', {"profiles": profiles})
else:
messages.success(request, ("That's Not Your Profile Page..."))
return redirect('home')
return handle_follow_view(request, pk, 'followers')
else:
messages.success(
request, ("You Must Be Logged In To View This Page..."))
Expand All @@ -118,12 +136,7 @@ def followers(request, pk):

def follows(request, pk):
if request.user.is_authenticated:
if request.user.id == pk:
profiles = Profile.objects.get(user_id=pk)
return render(request, 'follows.html', {"profiles": profiles})
else:
messages.success(request, ("That's Not Your Profile Page..."))
return redirect('home')
return handle_follow_view(request, pk, 'follows')
else:
messages.success(
request, ("You Must Be Logged In To View This Page..."))
Expand Down Expand Up @@ -177,24 +190,30 @@ def register_user(request):
return render(request, "register.html", {'form': form})


# Helper function to handle form validation and saving for update_user

def handle_user_forms(request, current_user, profile_user):
user_form = SignUpForm(request.POST or None,
request.FILES or None, instance=current_user)
profile_form = ProfilePicForm(
request.POST or None, request.FILES or None, instance=profile_user)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
login(request, current_user)
messages.success(request, ("Your Profile Has Been Updated!"))
return redirect('home')
return user_form, profile_form


def update_user(request):
if request.user.is_authenticated:
current_user = User.objects.get(id=request.user.id)
profile_user = Profile.objects.get(user__id=request.user.id)
# Get Forms
user_form = SignUpForm(request.POST or None,
request.FILES or None, instance=current_user)
profile_form = ProfilePicForm(
request.POST or None, request.FILES or None, instance=profile_user)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()

login(request, current_user)
messages.success(request, ("Your Profile Has Been Updated!"))
return redirect('home')

return render(request, "update_user.html", {'user_form': user_form, 'profile_form': profile_form})
user_form, profile_form = handle_user_forms(
request, current_user, profile_user)
return render(request, "update_user.html", {'user_form': user_form,
'profile_form': profile_form})
else:
messages.success(
request, ("You Must Be Logged In To View That Page..."))
Expand Down Expand Up @@ -247,27 +266,14 @@ def delete_post(request, pk):

def edit_post(request, pk):
if request.user.is_authenticated:
# Grab The Post!
post = get_object_or_404(Post, id=pk)

# Check to see if you own the post
if request.user.username == post.user.username:

form = PostForm(request.POST or None, instance=post)
if request.method == "POST":
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
messages.success(request, ("Your Post Has Been Updated!"))
return redirect('home')
else:
return render(request, "edit_post.html", {'form': form, 'post': post})

form = handle_post_form(request, post)
return render(request, "edit_post.html", {'form': form,
'post': post})
else:
messages.success(request, ("You Don't Own That Post!!"))
return redirect('home')

else:
messages.success(request, ("Please Log In To Continue..."))
return redirect('home')
Expand All @@ -280,7 +286,8 @@ def search(request):
# Search the database
searched = Post.objects.filter(body__contains=search)

return render(request, 'search.html', {'search': search, 'searched': searched})
return render(request, 'search.html', {'search': search,
'searched': searched})
else:
return render(request, 'search.html', {})

Expand All @@ -292,19 +299,20 @@ def search_user(request):
# Search the database
searched = User.objects.filter(username__contains=search)

return render(request, 'search_user.html', {'search': search, 'searched': searched})
return render(request, 'search_user.html', {'search': search,
'searched': searched})
else:
return render(request, 'search_user.html', {})


def share_post(request, pk):
if request.user.is_authenticated:
post = get_object_or_404(Post, id=pk)
# Create a new post with the same content
new_post = Post.objects.create(user=request.user, body=post.body)
new_post.save()
messages.success(request, ("The Post Has Been Shared!"))
return redirect('home')
post_url = request.build_absolute_uri(reverse('post_show', args=[pk]))

pyperclip.copy(post_url)
messages.success(
request, ("The URL has been copied to the clipboard!"))
return JsonResponse({'message': 'URL copied to clipboard'})
else:
messages.success(request, ("You Must Be Logged In To Share Posts..."))
return redirect('home')
Binary file modified sociasphere/db.sqlite3
Binary file not shown.

0 comments on commit ce37d99

Please sign in to comment.