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.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."""
|
"""customized user field."""
|
||||||
username = models.CharField(max_length=30, unique=True) # max to 30 char
|
username = models.CharField(max_length=30, unique=True) # max to 30 char
|
||||||
USERNAME_FIELD = 'username' # setting username field to "id"
|
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
|
shown_name = models.CharField(max_length=50) # max to 50 char
|
||||||
|
|
||||||
url = models.URLField(max_length=200) # max to 200 char
|
url = models.URLField(max_length=200) # max to 200 char
|
||||||
|
@ -27,10 +29,14 @@ class User(AbstractBaseUser):
|
||||||
choices=GROUP_CLASSES,
|
choices=GROUP_CLASSES,
|
||||||
default='general',
|
default='general',
|
||||||
)
|
)
|
||||||
|
is_staff = models.BooleanField(default=False)
|
||||||
|
is_superuser = models.BooleanField(default=False)
|
||||||
|
|
||||||
email = models.EmailField(max_length=200) # max to 200 char
|
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):
|
class Following(models.Model):
|
||||||
follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower")
|
follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower")
|
||||||
|
@ -40,7 +46,7 @@ class Following(models.Model):
|
||||||
class Post(models.Model):
|
class Post(models.Model):
|
||||||
text = models.TextField()
|
text = models.TextField()
|
||||||
poster = models.ForeignKey(User, on_delete=models.CASCADE)
|
poster = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
post_time = models.DateTimeField()
|
post_time = models.DateTimeField(default=timezone.now())
|
||||||
|
|
||||||
GROUP_PRIVILAGES = [
|
GROUP_PRIVILAGES = [
|
||||||
('public', 'public'), # post to public timeline
|
('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.
|
# automatically redirect to home page (/home) after login.
|
||||||
LOGIN_REDIRECT_URL = '/home'
|
LOGIN_REDIRECT_URL = '/home'
|
||||||
|
|
||||||
|
# custom users
|
||||||
|
AUTH_USER_MODEL = 'khaikang.User'
|
||||||
|
|
||||||
|
# timezone
|
||||||
|
USE_TZ = True
|
|
@ -20,6 +20,8 @@ from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
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('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.http import HttpResponse
|
||||||
from django.template import loader
|
from django.template import loader
|
||||||
from .models import User, Post
|
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):
|
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)
|
print(public_timeline_list)
|
||||||
|
|
||||||
template = loader.get_template('index.html')
|
template = loader.get_template('index.html')
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'latest_question_list': public_timeline_list,
|
'public_timeline_list': public_timeline_list,
|
||||||
}
|
}
|
||||||
return HttpResponse(template.render(context, request))
|
return HttpResponse(template.render(context, request))
|
|
@ -1,12 +1,94 @@
|
||||||
{% extends "base_generic.html" %}
|
{% extends "base_generic.html" %}
|
||||||
|
|
||||||
|
{% load tz %}
|
||||||
|
{% get_current_timezone as TIME_ZONE %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<form method="POST" id="posting-form">
|
<form method="POST" id="posting-form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="posting-form-group">
|
<div class="posting-form-group">
|
||||||
<label>Post</label>
|
<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>
|
</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>
|
</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 %}
|
{% 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