add functionality
This commit is contained in:
parent
7da0318e40
commit
20d7284d9c
7 changed files with 180 additions and 12 deletions
7
khaikang/admin.py
Normal file
7
khaikang/admin.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
from django.contrib import admin
|
||||
from django.contrib.auth.admin import UserAdmin
|
||||
from .models import User, Post, Following
|
||||
|
||||
admin.site.register(User, UserAdmin)
|
||||
admin.site.register(Post)
|
||||
admin.site.register(Following)
|
|
@ -1,12 +1,14 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth.models import AbstractBaseUser
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.contrib.auth.models import UserManager
|
||||
from django.utils import timezone
|
||||
|
||||
class User(AbstractBaseUser):
|
||||
class User(AbstractUser):
|
||||
"""customized user field."""
|
||||
username = models.CharField(max_length=30, unique=True) # max to 30 char
|
||||
USERNAME_FIELD = 'username' # setting username field to "id"
|
||||
|
||||
created_time = models.DateTimeField()
|
||||
created_time = models.DateTimeField(default=timezone.now(), blank=True)
|
||||
shown_name = models.CharField(max_length=50) # max to 50 char
|
||||
|
||||
url = models.URLField(max_length=200) # max to 200 char
|
||||
|
@ -27,10 +29,14 @@ class User(AbstractBaseUser):
|
|||
choices=GROUP_CLASSES,
|
||||
default='general',
|
||||
)
|
||||
is_staff = models.BooleanField(default=False)
|
||||
is_superuser = models.BooleanField(default=False)
|
||||
|
||||
email = models.EmailField(max_length=200) # max to 200 char
|
||||
|
||||
REQUIRED_FIELDS = ['id', 'shown_name', 'classfication', 'email']
|
||||
objects = UserManager() # for admin user use
|
||||
|
||||
REQUIRED_FIELDS = ['shown_name', 'classfication', 'email', 'is_staff', 'is_superuser']
|
||||
|
||||
class Following(models.Model):
|
||||
follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower")
|
||||
|
@ -40,7 +46,7 @@ class Following(models.Model):
|
|||
class Post(models.Model):
|
||||
text = models.TextField()
|
||||
poster = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
post_time = models.DateTimeField()
|
||||
post_time = models.DateTimeField(default=timezone.now())
|
||||
|
||||
GROUP_PRIVILAGES = [
|
||||
('public', 'public'), # post to public timeline
|
||||
|
|
|
@ -126,3 +126,9 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|||
|
||||
# automatically redirect to home page (/home) after login.
|
||||
LOGIN_REDIRECT_URL = '/home'
|
||||
|
||||
# custom users
|
||||
AUTH_USER_MODEL = 'khaikang.User'
|
||||
|
||||
# timezone
|
||||
USE_TZ = True
|
|
@ -20,6 +20,8 @@ from . import views
|
|||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('accounts/', include('django.contrib.auth.urls')),
|
||||
path('account/', include('django.contrib.auth.urls')),
|
||||
path('home/', views.home, name='home'),
|
||||
path('signup/', views.signup),
|
||||
path('api/post', views.api_post),
|
||||
]
|
||||
|
|
|
@ -1,16 +1,71 @@
|
|||
|
||||
import json
|
||||
from django.http import HttpResponse
|
||||
from django.template import loader
|
||||
from .models import User, Post
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth.forms import UserCreationForm
|
||||
from django.shortcuts import redirect
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
|
||||
def api_post(request):
|
||||
if request.method == 'POST':
|
||||
post_body_orig = request.body.decode('utf-8')
|
||||
post_body_json = json.loads(post_body_orig)
|
||||
post_text = post_body_json["text"]
|
||||
post_privilage = post_body_json["privilage"]
|
||||
print(f"結果:{post_privilage}, {post_text}")
|
||||
current_user = request.user
|
||||
print(current_user.id)
|
||||
|
||||
current_user_object = User.objects.get(id=int(current_user.id))
|
||||
|
||||
a_post = Post(privilage = post_privilage, text = post_text, poster = current_user_object,
|
||||
post_time = timezone.now())
|
||||
a_post.save()
|
||||
return HttpResponse(200, str(post_text))
|
||||
|
||||
def signup(request):
|
||||
|
||||
class KhaikangUserCreationForm(UserCreationForm):
|
||||
def save(self, commit=True):
|
||||
user = super(KhaikangUserCreationForm, self).save(commit=False)
|
||||
user.shown_name = self.cleaned_data["username"]
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
|
||||
class Meta(UserCreationForm.Meta):
|
||||
model = User
|
||||
fields = UserCreationForm.Meta.fields + ('email',)
|
||||
|
||||
form = KhaikangUserCreationForm()
|
||||
|
||||
if request.method == "POST":
|
||||
form = KhaikangUserCreationForm(request.POST)
|
||||
if form.is_valid():
|
||||
form.fields['shown_name'] = form.fields['username']
|
||||
print(form.fields['shown_name'])
|
||||
form.save()
|
||||
return redirect('/account/login') #redirect to login
|
||||
|
||||
if request.user != AnonymousUser():
|
||||
return redirect('/home') # redirect to main page
|
||||
|
||||
form = KhaikangUserCreationForm()
|
||||
|
||||
template = loader.get_template('signup.html')
|
||||
return HttpResponse(template.render({'form': form}, request))
|
||||
|
||||
def home(request):
|
||||
public_timeline_list = Post.objects.filter(privilage = 'public')[:10]
|
||||
|
||||
public_timeline_list = Post.objects.filter(privilage = 'public').order_by('-id')[:10]
|
||||
|
||||
|
||||
print(public_timeline_list)
|
||||
|
||||
template = loader.get_template('index.html')
|
||||
|
||||
context = {
|
||||
'latest_question_list': public_timeline_list,
|
||||
'public_timeline_list': public_timeline_list,
|
||||
}
|
||||
return HttpResponse(template.render(context, request))
|
|
@ -1,12 +1,94 @@
|
|||
{% extends "base_generic.html" %}
|
||||
|
||||
{% load tz %}
|
||||
{% get_current_timezone as TIME_ZONE %}
|
||||
{% block content %}
|
||||
<form method="POST" id="posting-form">
|
||||
{% csrf_token %}
|
||||
<div class="posting-form-group">
|
||||
<label>Post</label>
|
||||
<input type="text" class="form-post" id="post_text" placeholder="What do you want to post?">
|
||||
|
||||
<textarea id="post_text" name="post_text" placeholder="What do you want to post?"
|
||||
maxlength="500" style="resize: none;" oninput="auto_expand(this)"></textarea>
|
||||
</div>
|
||||
<button type="submit_post" class="btn">Post!</button>
|
||||
|
||||
{% csrf_token %}
|
||||
|
||||
<label for="privilege">Privileges:</label>
|
||||
|
||||
<select name="privilege" id="privil_choosing">
|
||||
<option value="public" selected>Public Timeline</option>
|
||||
<option value="unpublic">Not in Public Timeline</option>
|
||||
<option value="private">Private</option>
|
||||
</select>
|
||||
|
||||
<button id="submit_post" type="button" class="btn">Post!</button>
|
||||
</form>
|
||||
|
||||
<div id="public_timeline">
|
||||
{% for public_post in public_timeline_list %}
|
||||
|
||||
<div id="post-{{public_post.id}}" class="post"><a href="user/{{public_post.poster}}">{{public_post.poster.shown_name}}</a>
|
||||
at <a href="post/{{public_post.id}}" class="post-time">{{public_post.post_time|date:"Y-m-d H:i:s"}}+0000</a><br/>
|
||||
{{public_post.text}}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
function timezoneChanging(){
|
||||
document.querySelectorAll(".post-time").forEach(
|
||||
(x)=>{var date= new Date(x.innerHTML);
|
||||
var year = date.getFullYear().toString();
|
||||
var month = (date.getMonth()+1).toString().padStart(2, '0');
|
||||
var day = date.getDate().toString().padStart(2, '0');
|
||||
var hour = date.getHours().toString().padStart(2, '0');
|
||||
var min = date.getMinutes().toString().padStart(2, '0');
|
||||
var sec = date.getSeconds().toString().padStart(2, '0');
|
||||
local_date_string = `${year}-${month}-${day} ${hour}:${min}:${sec}`;
|
||||
x.innerHTML=local_date_string;}
|
||||
);
|
||||
}
|
||||
|
||||
$name = (x) => document.getElementsByName(x);
|
||||
$ = (x) => document.getElementById(x);
|
||||
var httpRequest;
|
||||
$("submit_post").addEventListener('click', make_req);
|
||||
|
||||
async function make_req() {
|
||||
|
||||
post_text = $('post_text').value;
|
||||
post_privilage = $('privil_choosing').value;
|
||||
|
||||
await fetch('/api/post', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
"X-CSRFToken": "{{ csrf_token }}",
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
"privilage" : post_privilage,
|
||||
"text": post_text,
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function auto_expand(element) {
|
||||
element.style.height = 6+"em";
|
||||
element.style.height = (element.scrollHeight)+"px";
|
||||
}
|
||||
|
||||
timezoneChanging();
|
||||
|
||||
function adjust_post_text(){
|
||||
var post_text = $("post_text");
|
||||
post_text.style.height = 6+"em";
|
||||
post_text.style.height = (post_text.scrollHeight)+"px";
|
||||
}
|
||||
|
||||
adjust_post_text();
|
||||
</script>
|
||||
{% endblock %}
|
10
templates/signup.html
Normal file
10
templates/signup.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% extends 'base_generic.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Sign up</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit">Sign up</button>
|
||||
</form>
|
||||
{% endblock %}
|
Loading…
Reference in a new issue