add: profiles and profile page
This commit is contained in:
parent
dd19e15e7d
commit
c3c83b3168
11
frontend/static/css/profiles/profile.css
Normal file
11
frontend/static/css/profiles/profile.css
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#app #avatar
|
||||||
|
{
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app #username
|
||||||
|
{
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
}
|
11
frontend/static/css/profiles/profiles.css
Normal file
11
frontend/static/css/profiles/profiles.css
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#app .item img
|
||||||
|
{
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app .item a
|
||||||
|
{
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
}
|
@ -18,6 +18,13 @@ class Profiles
|
|||||||
});
|
});
|
||||||
return profiles;
|
return profiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getProfile(user_id)
|
||||||
|
{
|
||||||
|
let profile = new Profile(this.client);
|
||||||
|
await profile.init(user_id);
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export {Profiles}
|
export {Profiles}
|
@ -1,7 +1,5 @@
|
|||||||
import LoginView from "./views/accounts/LoginView.js";
|
import LoginView from "./views/accounts/LoginView.js";
|
||||||
import Dashboard from "./views/Dashboard.js";
|
import Dashboard from "./views/Dashboard.js";
|
||||||
import Posts from "./views/Posts.js";
|
|
||||||
import PostView from "./views/PostView.js";
|
|
||||||
import Settings from "./views/Settings.js";
|
import Settings from "./views/Settings.js";
|
||||||
import Chat from "./views/Chat.js";
|
import Chat from "./views/Chat.js";
|
||||||
import HomeView from "./views/HomeView.js";
|
import HomeView from "./views/HomeView.js";
|
||||||
@ -11,6 +9,8 @@ import LogoutView from "./views/accounts/LogoutView.js";
|
|||||||
import { Client } from "./api/client.js";
|
import { Client } from "./api/client.js";
|
||||||
import AbstractRedirectView from "./views/AbstractRedirectView.js";
|
import AbstractRedirectView from "./views/AbstractRedirectView.js";
|
||||||
import MeView from "./views/MeView.js";
|
import MeView from "./views/MeView.js";
|
||||||
|
import ProfilePageView from "./views/profiles/ProfilePageView.js";
|
||||||
|
import ProfilesView from "./views/profiles/ProfilesView.js";
|
||||||
|
|
||||||
let client = new Client(location.protocol + "//" + location.host)
|
let client = new Client(location.protocol + "//" + location.host)
|
||||||
|
|
||||||
@ -35,8 +35,8 @@ const navigateTo = async (uri) => {
|
|||||||
const router = async (uri = "") => {
|
const router = async (uri = "") => {
|
||||||
const routes = [
|
const routes = [
|
||||||
{ path: "/", view: Dashboard },
|
{ path: "/", view: Dashboard },
|
||||||
{ path: "/posts", view: Posts },
|
{ path: "/profiles", view: ProfilesView},
|
||||||
{ path: "/posts/:id", view: PostView },
|
{ path: "/profiles/:id", view: ProfilePageView },
|
||||||
{ path: "/settings", view: Settings },
|
{ path: "/settings", view: Settings },
|
||||||
{ path: "/login", view: LoginView },
|
{ path: "/login", view: LoginView },
|
||||||
{ path: "/logout", view: LogoutView },
|
{ path: "/logout", view: LogoutView },
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { client } from "../index.js";
|
|
||||||
import AbstractAuthentificateView from "./AbstractAuthentifiedView.js";
|
import AbstractAuthentificateView from "./AbstractAuthentifiedView.js";
|
||||||
|
|
||||||
export default class extends AbstractAuthentificateView {
|
export default class extends AbstractAuthentificateView {
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
import AbstractView from "./AbstractView.js";
|
|
||||||
|
|
||||||
export default class extends AbstractView {
|
|
||||||
constructor(params) {
|
|
||||||
super(params, "Viewing Post");
|
|
||||||
this.postId = params.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
async getHtml() {
|
|
||||||
return `
|
|
||||||
<h1>Post</h1>
|
|
||||||
<p>You are viewing post #${this.postId}.</p>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import AbstractView from "./AbstractView.js";
|
|
||||||
|
|
||||||
export default class extends AbstractView {
|
|
||||||
constructor(params) {
|
|
||||||
super(params, "Posts");
|
|
||||||
}
|
|
||||||
|
|
||||||
async getHtml() {
|
|
||||||
return `
|
|
||||||
<h1>Posts</h1>
|
|
||||||
<p>You are viewing the posts!</p>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
29
frontend/static/js/views/profiles/ProfilePageView.js
Normal file
29
frontend/static/js/views/profiles/ProfilePageView.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import AbstractView from "../AbstractView.js";
|
||||||
|
import { client } from "../../index.js"
|
||||||
|
|
||||||
|
export default class extends AbstractView {
|
||||||
|
constructor(params) {
|
||||||
|
super(params, "Profile ");
|
||||||
|
this.user_id = params.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
async postInit()
|
||||||
|
{
|
||||||
|
let profile = await client.profiles.getProfile(this.user_id);
|
||||||
|
|
||||||
|
let username_element = document.getElementById("username");
|
||||||
|
username_element.href = `/profiles/${this.user_id}`;
|
||||||
|
username_element.appendChild(document.createTextNode(profile.username));
|
||||||
|
|
||||||
|
let avatar_element = document.getElementById("avatar");
|
||||||
|
avatar_element.src = profile.avatar_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtml() {
|
||||||
|
return `
|
||||||
|
<link rel="stylesheet" href="/static/css/profiles/profile.css">
|
||||||
|
<img id="avatar"/>
|
||||||
|
<a id="username"></a>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
40
frontend/static/js/views/profiles/ProfilesView.js
Normal file
40
frontend/static/js/views/profiles/ProfilesView.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import AbstractView from "../AbstractView.js";
|
||||||
|
import { client } from "../../index.js"
|
||||||
|
|
||||||
|
export default class extends AbstractView {
|
||||||
|
constructor(params) {
|
||||||
|
super(params, "Profiles");
|
||||||
|
}
|
||||||
|
|
||||||
|
async postInit()
|
||||||
|
{
|
||||||
|
let profiles = await client.profiles.all()
|
||||||
|
let profile_list_element = document.getElementById("profile-list")
|
||||||
|
|
||||||
|
profiles.forEach((profile) => {
|
||||||
|
let profile_element = document.createElement("div");
|
||||||
|
profile_element.className = "item";
|
||||||
|
|
||||||
|
let avatar = document.createElement("img");
|
||||||
|
avatar.src = profile.avatar_url;
|
||||||
|
|
||||||
|
let username = document.createElement("a");
|
||||||
|
username.href = `/profiles/${profile.user_id}`;
|
||||||
|
username.appendChild(document.createTextNode(profile.username));
|
||||||
|
|
||||||
|
profile_element.appendChild(avatar);
|
||||||
|
profile_element.appendChild(username);
|
||||||
|
|
||||||
|
profile_list_element.appendChild(profile_element)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtml() {
|
||||||
|
return `
|
||||||
|
<link rel="stylesheet" href="/static/css/profiles/profiles.css">
|
||||||
|
<div id="profile-list">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
@ -10,8 +10,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<nav class="nav">
|
<nav class="nav">
|
||||||
<a href="/" class="nav__link" data-link>Dashboard</a>
|
<a href="/" class="nav__link" data-link>Dashboard</a>
|
||||||
<a href="/posts" class="nav__link" data-link>Posts</a>
|
<a href="/profiles" class="nav__link" data-link>Profiles</a>
|
||||||
<a href="/settings" class="nav__link" data-link>Settings</a>
|
|
||||||
<a href="/login" class="nav__link" data-link>Login</a>
|
<a href="/login" class="nav__link" data-link>Login</a>
|
||||||
<a href="/register" class="nav__link" data-link>Register</a>
|
<a href="/register" class="nav__link" data-link>Register</a>
|
||||||
<a href="/chat" class="nav__link" data-link>Chat</a>
|
<a href="/chat" class="nav__link" data-link>Chat</a>
|
||||||
|
@ -11,22 +11,22 @@ from .serializers import ProfileSerializer
|
|||||||
from .models import ProfileModel
|
from .models import ProfileModel
|
||||||
|
|
||||||
class ProfileViewSet(viewsets.ModelViewSet):
|
class ProfileViewSet(viewsets.ModelViewSet):
|
||||||
queryset = ProfileModel.objects.order_by('-pk')
|
queryset = ProfileModel.objects.all()
|
||||||
serializer_class = ProfileSerializer
|
serializer_class = ProfileSerializer
|
||||||
parser_classes = (MultiPartParser, FormParser)
|
parser_classes = (MultiPartParser, FormParser)
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
def retrieve(self, request: HttpRequest, pk=None):
|
def retrieve(self, request: HttpRequest, pk=None):
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
instance.avatar_url.name = instance.avatar_url.name.replace("profiles", "", 1)
|
instance.avatar_url.name = instance.avatar_url.name[instance.avatar_url.name.find("static") - 1:]
|
||||||
return Response(self.serializer_class(instance).data,
|
return Response(self.serializer_class(instance).data,
|
||||||
status=status.HTTP_200_OK)
|
status=status.HTTP_200_OK)
|
||||||
|
|
||||||
def get_queryset(self):
|
def list(self, request: HttpRequest):
|
||||||
profiles = ProfileModel.objects.all()
|
serializer = ProfileSerializer(self.queryset, many=True)
|
||||||
for profile in profiles:
|
for profile in serializer.data:
|
||||||
profile.avatar_url.name = profile.avatar_url.name.replace("profiles", "", 1)
|
profile["avatar_url"] = profile["avatar_url"][profile["avatar_url"].find("static") - 1:]
|
||||||
return profiles
|
return Response(serializer.data)
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(user=self.request.user)
|
serializer.save(user=self.request.user)
|
||||||
|
Loading…
Reference in New Issue
Block a user