mirror of
https://github.com/Mistake35/Cedar-Django.git
synced 2026-07-18 00:21:14 +10:00
The first steps or whatever
balls
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import UsersBan
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
|
||||||
|
class UsersBanModel(admin.ModelAdmin):
|
||||||
|
list_display = ['user', 'ban', ]
|
||||||
|
list_filter = ('ban', )
|
||||||
|
search_fields = ('user__username', 'user__id', 'user__first_name', 'user__last_name')
|
||||||
|
|
||||||
|
'''
|
||||||
|
admin.site.register(UsersBan, UsersBanModel)
|
||||||
|
'''
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class BanConfig(AppConfig):
|
||||||
|
name = 'ban'
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponseForbidden
|
||||||
|
from .models import UsersBan
|
||||||
|
|
||||||
|
class BanManagement():
|
||||||
|
"""Users Management"""
|
||||||
|
|
||||||
|
def __init__(self, get_response):
|
||||||
|
self.get_response = get_response
|
||||||
|
|
||||||
|
def __call__(self, request):
|
||||||
|
response = self.get_response(request)
|
||||||
|
|
||||||
|
if(UsersBan.objects.all().filter(ban=True, user_id=request.user.id)):
|
||||||
|
return HttpResponseForbidden('Commit suicide')
|
||||||
|
elif request.user.is_authenticated:
|
||||||
|
if not request.user.is_active():
|
||||||
|
return HttpResponseForbidden(request.user.warned_reason)
|
||||||
|
else:
|
||||||
|
return response
|
||||||
|
else:
|
||||||
|
return response
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2022-02-28 20:18
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UsersBan',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('ban', models.BooleanField(default=False, help_text='Users Bans', verbose_name='Ban')),
|
||||||
|
('user', models.ForeignKey(help_text='Choose Username', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User name')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name_plural': 'Ban Management',
|
||||||
|
'ordering': ('user',),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2022-09-03 21:00
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ban', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='usersban',
|
||||||
|
name='reason',
|
||||||
|
field=models.CharField(blank=True, max_length=1024, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2022-09-03 21:03
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ban', '0002_usersban_reason'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='usersban',
|
||||||
|
name='reason',
|
||||||
|
),
|
||||||
|
]
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,16 @@
|
|||||||
|
from django.db import models
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
|
||||||
|
class UsersBan(models.Model):
|
||||||
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="User name", help_text="Choose Username", on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
ban = models.BooleanField(default=False, verbose_name="Ban", help_text="Users Bans")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = "Ban Management"
|
||||||
|
ordering = ('user', )
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return '{}'.format(self.user)
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>commit suicide</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
@@ -0,0 +1,240 @@
|
|||||||
|
"""
|
||||||
|
Django settings for closedverse project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 1.10.7.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/1.10/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/1.10/ref/settings/
|
||||||
|
"""
|
||||||
|
# Django Settings
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = False
|
||||||
|
PROD = False
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret! (If you want a website that can generate key https://miniwebtool.com/django-secret-key-generator/ goto here.)
|
||||||
|
SECRET_KEY = ''
|
||||||
|
|
||||||
|
# Change the ALLOWED_HOSTS to your liking.
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = [
|
||||||
|
'domain.com'
|
||||||
|
]
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'admin_interface',
|
||||||
|
'colorfield',
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'markdown_deux',
|
||||||
|
'closedverse_main',
|
||||||
|
'ban',
|
||||||
|
'maintenance',
|
||||||
|
]
|
||||||
|
X_FRAME_OPTIONS='SAMEORIGIN'
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
'ban.middleware.BanManagement',
|
||||||
|
'closedverse_main.middleware.ClosedMiddleware',
|
||||||
|
'maintenance.middleware.MaintenanceManagement',
|
||||||
|
'whitenoise.middleware.WhiteNoiseMiddleware'
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'closedverse.urls'
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'DIRS': [],
|
||||||
|
'APP_DIRS': True,
|
||||||
|
'OPTIONS': {
|
||||||
|
'context_processors': [
|
||||||
|
'django.template.context_processors.debug',
|
||||||
|
'django.template.context_processors.request',
|
||||||
|
'django.contrib.auth.context_processors.auth',
|
||||||
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'closedverse.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': BASE_DIR + '/sql.sqlite3',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# log errors.
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'handlers': {
|
||||||
|
'file': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'class': 'logging.FileHandler',
|
||||||
|
'filename': 'logs/errors.log',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django': {
|
||||||
|
'handlers': ['file'],
|
||||||
|
'level': 'ERROR',
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/1.10/topics/i18n/
|
||||||
|
|
||||||
|
TIME_ZONE = 'PST8PDT'
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
# You can use Mailtrap to get the email system working. Mailtrap is free and will work well for what you'll be doing with this.
|
||||||
|
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
||||||
|
EMAIL_HOST = 'send.smtp.mailtrap.io'
|
||||||
|
EMAIL_HOST_USER = 'api'
|
||||||
|
EMAIL_HOST_PASSWORD = ''
|
||||||
|
EMAIL_PORT = ''
|
||||||
|
EMAIL_USE_TLS = True
|
||||||
|
DEFAULT_FROM_EMAIL = 'noreply@domain'
|
||||||
|
|
||||||
|
AUTH_USER_MODEL = 'closedverse_main.User'
|
||||||
|
CSRF_FAILURE_VIEW = 'closedverse_main.views.csrf_fail'
|
||||||
|
LOGIN_URL = '/login/'
|
||||||
|
LOGIN_REDIRECT_URL = '/login/'
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/1.10/howto/static-files/
|
||||||
|
STATICFILES_DIRS = [
|
||||||
|
os.path.join(BASE_DIR, 'static/')
|
||||||
|
]
|
||||||
|
STATIC_URL = '/s/'
|
||||||
|
STATIC_ROOT = os.path.join(BASE_DIR, 's/')
|
||||||
|
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
|
||||||
|
|
||||||
|
# Media root
|
||||||
|
# This MUST end with a trailing slash and there must be an 'rm' folder in it
|
||||||
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
|
||||||
|
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||||
|
# trailing slash.
|
||||||
|
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
|
||||||
|
MEDIA_URL = '/i/'
|
||||||
|
|
||||||
|
# Cedar Three settings
|
||||||
|
# reCAPTCHA v2 keys, None for no reCAPTCHA
|
||||||
|
recaptcha_pub = ''
|
||||||
|
recaptcha_priv = ''
|
||||||
|
|
||||||
|
# NNID forbidden list. None for no passing.
|
||||||
|
nnid_forbiddens = BASE_DIR + '/forbidden.json'
|
||||||
|
|
||||||
|
# Memo title and message on communities list
|
||||||
|
# I got rid of this setting because it was annoying i guess, edit the HTML to change it. -seedur
|
||||||
|
|
||||||
|
# Client key to use for iphub.email, because we're using that
|
||||||
|
# None for no IP checking (recommended since this is so slow)
|
||||||
|
iphub_key = ""
|
||||||
|
|
||||||
|
# If IP can be checked, then use this to disallow any proxies
|
||||||
|
disallow_proxy = False
|
||||||
|
|
||||||
|
# MD
|
||||||
|
MARKDOWN_DEUX_STYLES = {
|
||||||
|
"default": {
|
||||||
|
"extras": {
|
||||||
|
"code-friendly": None,
|
||||||
|
},
|
||||||
|
"safe_mode": "escape",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# allow sign ups.
|
||||||
|
allow_signups = True
|
||||||
|
|
||||||
|
# Minimum level required to view IP addresses and user agents. (default: 10)
|
||||||
|
# Mods under this level will still be able to manage users, however will not be able to view any sensitive data.
|
||||||
|
min_lvl_metadata_perms = 10
|
||||||
|
|
||||||
|
# file size limits in megabytes! only applies when using the community tools.
|
||||||
|
max_icon_size = .5
|
||||||
|
max_banner_size = 1
|
||||||
|
|
||||||
|
# The minimum length required for a user's password. This is to save the users from themselves in the event of a data breach. The longer and more complex the password is, the harder it is to be cracked. (default: 7)
|
||||||
|
# This will definitely miss a few people off who just want to sign up without worrying about long passwords.
|
||||||
|
minimum_password_length = 7
|
||||||
|
|
||||||
|
# The hard limit for uploading, Will cause an error if this is exceeded. This is set to 15MB by default (15728640)
|
||||||
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 15728640
|
||||||
|
|
||||||
|
# Set the default theme here! Set this to None to use the normal Closedverse theme.
|
||||||
|
# TODO, make this work for users who aren't logged in.
|
||||||
|
site_wide_theme_hex = "#ff00cd"
|
||||||
|
|
||||||
|
# The location to redirect to if a user's status is set to 2 (Redirect) (rickroll)
|
||||||
|
inactive_redirect = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
||||||
|
|
||||||
|
# Option to delete image if it's local
|
||||||
|
# 0 - keep, 1 - move to 'rm' folder, 2 - DELETE
|
||||||
|
image_delete_opt = 0
|
||||||
|
|
||||||
|
# age (minimal 13 due to C.O.P.P.A)
|
||||||
|
age_allowed = "16"
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
"""closedverse URL Configuration
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/1.10/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.conf.urls import url, include
|
||||||
|
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.conf.urls import url, include
|
||||||
|
|
||||||
|
from django.contrib import admin
|
||||||
|
from .settings import INSTALLED_APPS, MEDIA_ROOT, MEDIA_URL
|
||||||
|
from django.conf.urls.static import static
|
||||||
|
handler500 = 'closedverse_main.views.server_err'
|
||||||
|
urlpatterns = [
|
||||||
|
url(r'^admin/', admin.site.urls),
|
||||||
|
url(r'^', include('closedverse_main.urls'))
|
||||||
|
]
|
||||||
|
|
||||||
|
if 'silk' in INSTALLED_APPS:
|
||||||
|
urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]
|
||||||
|
|
||||||
|
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for closedverse project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "closedverse.settings")
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
default_app_config = 'closedverse_main.apps.ClosedverseMainConfig'
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
#from django.contrib.auth.admin import UserAdmin
|
||||||
|
from django.contrib.auth.models import Group
|
||||||
|
from django.forms import ModelForm, PasswordInput
|
||||||
|
from closedverse_main import models
|
||||||
|
from closedverse import settings
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
# Override admin login page
|
||||||
|
from closedverse_main.views import login_page
|
||||||
|
admin.autodiscover()
|
||||||
|
admin.site.login = login_page
|
||||||
|
|
||||||
|
"""
|
||||||
|
class UserForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = models.User
|
||||||
|
fields = '__all__'
|
||||||
|
widgets = {
|
||||||
|
'password': PasswordInput(),
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
@admin.action(description='Hide selected items')
|
||||||
|
def Hide_Memo(modeladmin, request, queryset):
|
||||||
|
queryset.update(show = False)
|
||||||
|
@admin.action(description='Show selected items')
|
||||||
|
def Show_Memo(modeladmin, request, queryset):
|
||||||
|
queryset.update(show = True)
|
||||||
|
@admin.action(description='Hide selected items')
|
||||||
|
def Hide_content(modeladmin, request, queryset):
|
||||||
|
queryset.update(is_rm = True)
|
||||||
|
@admin.action(description='Show selected items')
|
||||||
|
def Show_content(modeladmin, request, queryset):
|
||||||
|
queryset.update(is_rm = False)
|
||||||
|
@admin.action(description='Feature selected communities')
|
||||||
|
def Feature_community(modeladmin, request, queryset):
|
||||||
|
queryset.update(is_feature = True)
|
||||||
|
@admin.action(description='Unfeature selected communities')
|
||||||
|
def Unfeature_community(modeladmin, request, queryset):
|
||||||
|
queryset.update(is_feature = False)
|
||||||
|
@admin.action(description='Force login')
|
||||||
|
def force_login(modeladmin, request, queryset):
|
||||||
|
queryset.update(require_auth = True)
|
||||||
|
@admin.action(description='Unforce login')
|
||||||
|
def unforce_login(modeladmin, request, queryset):
|
||||||
|
queryset.update(require_auth = False)
|
||||||
|
@admin.action(description='Disable user')
|
||||||
|
def Disable_user(modeladmin, request, queryset):
|
||||||
|
queryset.update(active = False)
|
||||||
|
|
||||||
|
class UserAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ('id', 'unique_id', 'username', 'nickname', 'email', )
|
||||||
|
list_display = ('id', 'username', 'nickname', 'warned', 'level', 'staff', 'active', )
|
||||||
|
exclude = ('addr', 'signup_addr', 'password', )
|
||||||
|
actions = [Disable_user]
|
||||||
|
#exclude = ('staff', )
|
||||||
|
# Not yet
|
||||||
|
#form = UserForm
|
||||||
|
class ProfileAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ('id', 'unique_id', 'origin_id', )
|
||||||
|
raw_id_fields = ('user', 'favorite', 'adopted', )
|
||||||
|
list_display = ('id', 'user', 'comment', 'let_freedom', )
|
||||||
|
|
||||||
|
class ComplaintAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ('id', 'unique_id', 'body', )
|
||||||
|
raw_id_fields = ('creator', )
|
||||||
|
class ConversationAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ('id', 'unique_id', )
|
||||||
|
raw_id_fields = ('source', 'target', )
|
||||||
|
|
||||||
|
class PostAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('creator', 'poll', )
|
||||||
|
search_fields = ('id', 'unique_id', 'body', 'creator__username', )
|
||||||
|
list_display = ('id', 'creator', 'body', 'is_rm', )
|
||||||
|
actions = [Hide_content, Show_content]
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return models.Post.real.get_queryset()
|
||||||
|
|
||||||
|
class CommentAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('creator', 'original_post', )
|
||||||
|
search_fields = ('id', 'unique_id', 'body', 'creator__username', )
|
||||||
|
list_display = ('id', 'creator', 'body', 'original_post', 'is_rm', )
|
||||||
|
actions = [Hide_content, Show_content]
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return models.Comment.real.get_queryset()
|
||||||
|
|
||||||
|
class CommunityAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('creator', )
|
||||||
|
list_display = ('id', 'name', 'description', 'type', 'creator', 'is_rm', 'is_feature', 'require_auth')
|
||||||
|
search_fields = ('id', 'unique_id', 'name', 'description', )
|
||||||
|
actions = [Hide_content, Show_content, Feature_community, Unfeature_community, force_login, unforce_login]
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return models.Community.real.get_queryset()
|
||||||
|
|
||||||
|
class MessageAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('creator', 'conversation', )
|
||||||
|
search_fields = ('id', 'unique_id', 'body', 'creator__username', )
|
||||||
|
list_display = ('id', 'creator', 'conversation', 'body', )
|
||||||
|
actions = [Hide_content, Show_content]
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return models.Message.real.get_queryset()
|
||||||
|
|
||||||
|
class NotificationAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('to', 'source', 'context_post', 'context_comment', )
|
||||||
|
search_fields = ('unique_id', )
|
||||||
|
list_display = ('id', 'to', 'source', 'context_post', 'context_comment', )
|
||||||
|
|
||||||
|
class AuditAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('by', 'user', 'post', 'comment', 'reversed_by', )
|
||||||
|
search_fields = ('by__username', 'user__username', )
|
||||||
|
|
||||||
|
class AdsAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fileds = ('id', 'created', 'url', 'imageurl')
|
||||||
|
|
||||||
|
class MOTDAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fileds = ('id', 'created', 'message', )
|
||||||
|
list_display = ('message', 'show', 'order', 'created', )
|
||||||
|
actions = [Hide_Memo, Show_Memo]
|
||||||
|
|
||||||
|
class WelcomemsgAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fileds = ('id', 'created', 'message', )
|
||||||
|
list_display = ('Title', 'message', 'show', 'order', 'created', )
|
||||||
|
actions = [Hide_Memo, Show_Memo]
|
||||||
|
|
||||||
|
class YeahAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('by', 'post', 'comment', )
|
||||||
|
list_display = ('by', 'post', 'comment', )
|
||||||
|
search_fields = ('by__username', 'post__body', 'comment__body', )
|
||||||
|
|
||||||
|
class HistoryAdmin(admin.ModelAdmin):
|
||||||
|
raw_id_fields = ('user',)
|
||||||
|
list_display = ('id', 'user')
|
||||||
|
|
||||||
|
#class BlockAdmin(admin.ModelAdmin)
|
||||||
|
|
||||||
|
admin.site.unregister(Group)
|
||||||
|
|
||||||
|
admin.site.register(models.User, UserAdmin)
|
||||||
|
admin.site.register(models.Profile, ProfileAdmin)
|
||||||
|
admin.site.register(models.Community, CommunityAdmin)
|
||||||
|
admin.site.register(models.Complaint, ComplaintAdmin)
|
||||||
|
admin.site.register(models.Message, MessageAdmin)
|
||||||
|
admin.site.register(models.Conversation, ConversationAdmin)
|
||||||
|
admin.site.register(models.Notification, NotificationAdmin)
|
||||||
|
admin.site.register(models.UserBlock)
|
||||||
|
admin.site.register(models.AuditLog, AuditAdmin)
|
||||||
|
admin.site.register(models.ProfileHistory, HistoryAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(models.Post, PostAdmin)
|
||||||
|
admin.site.register(models.Comment, CommentAdmin)
|
||||||
|
admin.site.register(models.Ads, AdsAdmin)
|
||||||
|
admin.site.register(models.Motd, MOTDAdmin)
|
||||||
|
admin.site.register(models.welcomemsg, WelcomemsgAdmin)
|
||||||
|
admin.site.register(models.Yeah, YeahAdmin)
|
||||||
|
admin.site.register(models.Follow)
|
||||||
|
admin.site.register(models.FriendRequest)
|
||||||
|
admin.site.register(models.Friendship, ConversationAdmin)
|
||||||
|
admin.site.register(models.Poll)
|
||||||
|
admin.site.register(models.PollVote)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class ClosedverseMainConfig(AppConfig):
|
||||||
|
name = 'closedverse_main'
|
||||||
|
verbose_name = "Cedar"
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
from django.http import HttpResponseForbidden, HttpResponseBadRequest
|
||||||
|
from closedverse import settings
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
from django.contrib.auth import logout
|
||||||
|
from re import compile
|
||||||
|
|
||||||
|
class ClosedMiddleware(object):
|
||||||
|
def __init__(self, get_response):
|
||||||
|
self.get_response = get_response
|
||||||
|
|
||||||
|
def __call__(self, request):
|
||||||
|
response = self.get_response(request)
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
if not request.user.profile():
|
||||||
|
return HttpResponseForbidden('So, Somehow your profile is completely gone. Your account itself still exists, but your profile does not. Please contact an admin, and ask them to make a profile for you. If you are unable to contact someone, you should make a new account.')
|
||||||
|
else:
|
||||||
|
return response
|
||||||
|
'''
|
||||||
|
for keyword in ['24.61.157.95', ]:
|
||||||
|
if keyword in request.META['HTTP_CF_CONNECTING_IP']:
|
||||||
|
return redirect('https://file.garden/Xbo5elapeDSxWf1x/adam.mp4')
|
||||||
|
|
||||||
|
for keyword in ['PlayStation', 'Switch', '3DS', ]:
|
||||||
|
if keyword in request.META['HTTP_USER_AGENT']:
|
||||||
|
return HttpResponseForbidden('Error code 403')
|
||||||
|
'''
|
||||||
|
else:
|
||||||
|
return response
|
||||||
|
|
||||||
|
# Taken from https://python-programming.com/recipes/django-require-authentication-pages/
|
||||||
|
'''
|
||||||
|
class ClosedMiddleware(object):
|
||||||
|
def __init__(self, get_response):
|
||||||
|
self.get_response = get_response
|
||||||
|
|
||||||
|
def __call__(self, request):
|
||||||
|
# Force logins if it's set
|
||||||
|
if settings.force_login and not request.user.is_authenticated:
|
||||||
|
if not any(m.match(request.path_info.lstrip('/')) for m in EXEMPT_URLS):
|
||||||
|
if request.is_ajax():
|
||||||
|
return HttpResponseForbidden("Login is required")
|
||||||
|
return redirect(settings.LOGIN_REDIRECT_URL)
|
||||||
|
# Fix this ; put something in settings signifying if the server supports HTTPS or not
|
||||||
|
if not request.is_secure() and (not settings.DEBUG) and settings.PROD:
|
||||||
|
# Let's try to redirect to HTTPS for non-Nintendo stuff.
|
||||||
|
if not request.META.get('HTTP_USER_AGENT'):
|
||||||
|
return HttpResponseForbidden("You need a user agent.", content_type='text/plain')
|
||||||
|
if not request.is_secure() and not 'Nintendo' in request.META['HTTP_USER_AGENT']:
|
||||||
|
return redirect('https://{0}{1}'.format(request.get_host(), request.get_full_path()))
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
# User active; this doesn't work at the moment due to Postgres not being able to change bools to ints
|
||||||
|
if request.user.is_active() == 0:
|
||||||
|
return HttpResponseForbidden()
|
||||||
|
elif request.user.is_active() == 2:
|
||||||
|
return redirect(settings.inactive_redirect)
|
||||||
|
|
||||||
|
if not request.user.is_active:
|
||||||
|
return HttpResponseForbidden()
|
||||||
|
# If there isn't a request.session
|
||||||
|
if not request.session.get('passwd'):
|
||||||
|
request.session['passwd'] = request.user.password
|
||||||
|
else:
|
||||||
|
if request.session['passwd'] != request.user.password:
|
||||||
|
logout(request)
|
||||||
|
response = self.get_response(request)
|
||||||
|
|
||||||
|
return response
|
||||||
|
'''
|
||||||
|
|
||||||
|
"""
|
||||||
|
return HttpResponseForbidden("You're one sick fuck. I would never suggest removing an Inkling girl's clothes and licking her tiny body all over, nibbling her neck and kissing her adorable little nipples. Only a heartless monster would think about her cute girlish mouth and tongue wrapped around a thick cock slick with her saliva, pumping in and out of her mouth until it erupts, the cum more than her little throat can swallow. The idea of thick viscous semen overflowing, dribbling down her chin over her flat chest, her tiny hands scooping it all up and watching her suck it off her fingertips is just horrible. You're all a bunch of sick perverts, thinking of spreading her smooth slender thighs, cock poised at the entrance to her pure, tight, virginal pussy, and thrusting in deep as a whimper escapes her lips which are slippery with cum, while her small body shudders from having her cherry taken in one quick stroke. I am disgusted at how you'd get even more excited as you lean over her, listening to her quickening breath, her girlish moans and gasps while you hasten your strokes, her sweet pants warm and moist on your face and her flat chest, shiny with a sheen of fresh sweat, rising and falling rapidly to meet yours. It is truly nasty how you'd run your hands all over her tiny body while you violate her, feeling her nipples hardening against your tongue as you lick her chest, her neck and her armpits, savoring the scent of her skin and sweat while she trembles from the stimulation and as she reaches her climax, hearing her cry out softly as she has her first orgasm while that cock is buried impossibly deep inside her, pulsing violently as an intense amount of hot cum spurts forth and floods through her freshly-deflowered pussy for the first time, filling her womb only to spill out of her with a sickening squelch. And as you lie atop her flushed body, she murmurs breathlessly, \"You came so much inside of me,\" then her fingers dig into your back as she feels your cock hardening inside again.", content_type='text/plain')"""
|
||||||
@@ -0,0 +1,433 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2023-02-07 01:50
|
||||||
|
|
||||||
|
import closedverse_main.models
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='User',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('username', models.CharField(max_length=32, unique=True)),
|
||||||
|
('nickname', models.CharField(max_length=64, null=True)),
|
||||||
|
('password', models.CharField(max_length=128)),
|
||||||
|
('email', models.EmailField(blank=True, default='', max_length=254, null=True)),
|
||||||
|
('has_mh', models.BooleanField(default=False)),
|
||||||
|
('avatar', models.CharField(blank=True, default='', max_length=1200)),
|
||||||
|
('theme', closedverse_main.models.ColorField(blank=True, max_length=18, null=True)),
|
||||||
|
('level', models.SmallIntegerField(default=0)),
|
||||||
|
('role', models.SmallIntegerField(choices=[(0, 'normal'), (1, 'Bot'), (2, 'Administrator'), (3, 'Moderator'), (4, 'NO'), (5, 'Donator'), (6, 'Tester'), (7, 'Cools'), (8, 'Developer'), (9, 'SMF9-Django'), (10, 'Staff'), (11, 'GAY DOGWATER'), (12, 'DUMB SNAIL'), (13, 'Russian ADRIAN'), (14, 'Contest'), (15, 'Gamecon'), (16, 'Cedar')], default=0)),
|
||||||
|
('addr', models.CharField(blank=True, max_length=64, null=True)),
|
||||||
|
('signup_addr', models.CharField(blank=True, max_length=64, null=True)),
|
||||||
|
('user_agent', models.TextField(blank=True, null=True)),
|
||||||
|
('c_tokens', models.IntegerField(default=1)),
|
||||||
|
('hide_online', models.BooleanField(default=False)),
|
||||||
|
('color', closedverse_main.models.ColorField(blank=True, default='', max_length=18, null=True)),
|
||||||
|
('staff', models.BooleanField(default=False)),
|
||||||
|
('active', models.BooleanField(default=True)),
|
||||||
|
('warned', models.BooleanField(default=False)),
|
||||||
|
('warned_reason', models.CharField(blank=True, max_length=600, null=True)),
|
||||||
|
('bg_url', models.CharField(blank=True, max_length=300, null=True)),
|
||||||
|
('last_login', models.DateTimeField(auto_now=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Ads',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('url', models.CharField(max_length=256)),
|
||||||
|
('imageurl', models.ImageField(upload_to='ad/%y/%m/%d/')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Comment',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('feeling', models.SmallIntegerField(choices=[(0, 'normal'), (1, 'happy'), (2, 'wink'), (3, 'surprised'), (4, 'frustrated'), (5, 'confused'), (38, 'japan'), (39, 'lol i lied'), (69, 'adam is gay'), (70, 'I am a faggot!'), (71, 'Juice'), (72, 'Commit Suicide'), (73, 'Fresh!')], default=0)),
|
||||||
|
('body', models.TextField(null=True)),
|
||||||
|
('screenshot', models.CharField(blank=True, default='', max_length=1200, null=True)),
|
||||||
|
('drawing', models.CharField(blank=True, max_length=200, null=True)),
|
||||||
|
('spoils', models.BooleanField(default=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('edited', models.DateTimeField(auto_now=True)),
|
||||||
|
('befores', models.TextField(blank=True, null=True)),
|
||||||
|
('has_edit', models.BooleanField(default=False)),
|
||||||
|
('is_rm', models.BooleanField(default=False)),
|
||||||
|
('status', models.SmallIntegerField(choices=[(0, 'ok'), (1, 'delete by user'), (2, 'delete by authority'), (3, 'delete by mod'), (4, 'delete by admin'), (5, 'account pruge')], default=0)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Community',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=255)),
|
||||||
|
('description', models.TextField(blank=True, default='')),
|
||||||
|
('ico', models.ImageField(blank=True, null=True, upload_to='icon/%y/%m/%d/')),
|
||||||
|
('banner', models.ImageField(blank=True, null=True, upload_to='banner/%y/%m/%d/')),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'General'), (1, 'Game'), (2, 'Special'), (3, 'User Community'), (4, 'Hide')], default=0)),
|
||||||
|
('platform', models.SmallIntegerField(choices=[(0, 'none'), (1, '3ds'), (2, 'wii u'), (3, 'switch'), (4, 'both'), (5, 'PC'), (6, 'Xbox'), (7, 'Playstation')], default=0)),
|
||||||
|
('tags', models.CharField(blank=True, choices=[('announcements', 'main announcement community'), ('changelog', 'main changelog'), ('activity', 'Activity Feed posting community'), ('general', 'General Discussion Community')], max_length=255, null=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('updated', models.DateTimeField(auto_now=True)),
|
||||||
|
('is_rm', models.BooleanField(default=False)),
|
||||||
|
('is_feature', models.BooleanField(default=False)),
|
||||||
|
('require_auth', models.BooleanField(default=False)),
|
||||||
|
('allowed_users', models.TextField(blank=True, null=True)),
|
||||||
|
('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name_plural': 'communities',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Conversation',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conv_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conv_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Motd',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('order', models.IntegerField(default=1, max_length=3)),
|
||||||
|
('show', models.BooleanField(default=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('Title', models.CharField(blank=True, default='Title', max_length=256)),
|
||||||
|
('message', models.TextField()),
|
||||||
|
('hide_date', models.BooleanField(default=False)),
|
||||||
|
('image', models.ImageField(blank=True, max_length=255, null=True, upload_to='MOTD/%y/%m/%d/')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Poll',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('able_vote', models.BooleanField(default=True)),
|
||||||
|
('choices', models.TextField(default='[]')),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Post',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('feeling', models.SmallIntegerField(choices=[(0, 'normal'), (1, 'happy'), (2, 'wink'), (3, 'surprised'), (4, 'frustrated'), (5, 'confused'), (38, 'japan'), (39, 'lol i lied'), (69, 'adam is gay'), (70, 'I am a faggot!'), (71, 'Juice'), (72, 'Commit Suicide'), (73, 'Fresh!')], default=0)),
|
||||||
|
('body', models.TextField(null=True)),
|
||||||
|
('drawing', models.CharField(blank=True, max_length=200, null=True)),
|
||||||
|
('screenshot', models.CharField(blank=True, default='', max_length=1200, null=True)),
|
||||||
|
('url', models.URLField(blank=True, default='', max_length=1200, null=True)),
|
||||||
|
('spoils', models.BooleanField(default=False)),
|
||||||
|
('disable_yeah', models.BooleanField(default=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('edited', models.DateTimeField(auto_now=True)),
|
||||||
|
('befores', models.TextField(blank=True, null=True)),
|
||||||
|
('has_edit', models.BooleanField(default=False)),
|
||||||
|
('is_rm', models.BooleanField(default=False)),
|
||||||
|
('status', models.SmallIntegerField(choices=[(0, 'ok'), (1, 'delete by user'), (2, 'delete by authority'), (3, 'delete by mod'), (4, 'delete by admin'), (5, 'account pruge')], default=0)),
|
||||||
|
('community', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.community')),
|
||||||
|
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('poll', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.poll')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='welcomemsg',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('order', models.IntegerField(default=1, max_length=3)),
|
||||||
|
('show', models.BooleanField(default=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('Title', models.CharField(default='Title', max_length=256)),
|
||||||
|
('message', models.TextField()),
|
||||||
|
('image', models.ImageField(blank=True, max_length=255, null=True, upload_to='welcomemsg/%y/%m/%d/')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UserRequest',
|
||||||
|
fields=[
|
||||||
|
('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='closedverse_main.user')),
|
||||||
|
('ua', models.TextField(blank=True, default='', null=True)),
|
||||||
|
('latest', models.DateTimeField(auto_now=True)),
|
||||||
|
('status', models.SmallIntegerField(choices=[(0, 'submitted'), (1, 'viewed'), (2, 'accepted'), (3, 'decline'), (4, 'ignore')], default=0)),
|
||||||
|
],
|
||||||
|
bases=('closedverse_main.user',),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Yeah',
|
||||||
|
fields=[
|
||||||
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'post'), (1, 'comment')], default=0)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.comment')),
|
||||||
|
('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.post')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UserBlock',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('full', models.BooleanField(default=False)),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='block_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='block_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ThermostatTouch',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('lvl', models.IntegerField(default=1)),
|
||||||
|
('who', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Restriction',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'Prevent yeah'), (1, 'Prevent follow'), (2, 'Prevent comment')])),
|
||||||
|
('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='restriction_by', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='restriction_comment', to='closedverse_main.comment')),
|
||||||
|
('post', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='restriction_post', to='closedverse_main.post')),
|
||||||
|
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='restriction_user', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='RedFlag',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'Post'), (1, 'Comment'), (2, 'User')])),
|
||||||
|
('reason', models.SmallIntegerField(choices=[(0, 'Actual harassment'), (1, 'Spam'), (2, "I don't like this"), (3, 'Personal info'), (4, 'Obscene use of swearing'), (5, 'NSFW where not allowed'), (6, 'Overly advertising/spam'), (7, 'Please delete this')])),
|
||||||
|
('reasoning', models.TextField(blank=True, default='', null=True)),
|
||||||
|
('comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.comment')),
|
||||||
|
('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.post')),
|
||||||
|
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ProfileHistory',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('old_nickname', models.CharField(blank=True, max_length=64)),
|
||||||
|
('new_nickname', models.CharField(blank=True, max_length=64)),
|
||||||
|
('old_comment', models.TextField(blank=True)),
|
||||||
|
('new_comment', models.TextField(blank=True)),
|
||||||
|
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Profile',
|
||||||
|
fields=[
|
||||||
|
('is_new', models.BooleanField(default=True)),
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('origin_id', models.CharField(blank=True, max_length=16, null=True)),
|
||||||
|
('origin_info', models.CharField(blank=True, max_length=255, null=True)),
|
||||||
|
('comment', models.TextField(blank=True, default='')),
|
||||||
|
('country', models.CharField(blank=True, default='', max_length=120)),
|
||||||
|
('whatareyou', models.CharField(blank=True, default='', max_length=120)),
|
||||||
|
('id_visibility', models.SmallIntegerField(choices=[(0, 'show'), (1, 'friends only'), (2, 'hide')], default=0)),
|
||||||
|
('pronoun_is', models.IntegerField(choices=[(0, "I don't know"), (1, 'He/him'), (2, 'She/her'), (3, 'He/she'), (4, 'It'), (5, 'They/Them')], default=0)),
|
||||||
|
('gender_is', models.IntegerField(choices=[(0, "I don't know"), (1, 'Girl'), (2, 'Boy'), (3, 'Minion'), (4, 'Toaster'), (5, 'Dinosaur'), (6, 'Truck'), (7, 'Robot'), (8, 'Monkey'), (9, 'Big chungus'), (10, 'Other')], default=0)),
|
||||||
|
('let_friendrequest', models.SmallIntegerField(choices=[(0, 'show'), (1, 'friends only'), (2, 'hide')], default=0)),
|
||||||
|
('yeahs_visibility', models.SmallIntegerField(choices=[(0, 'show'), (1, 'friends only'), (2, 'hide')], default=0)),
|
||||||
|
('comments_visibility', models.SmallIntegerField(choices=[(0, 'show'), (1, 'friends only'), (2, 'hide')], default=2)),
|
||||||
|
('weblink', models.CharField(blank=True, default='', max_length=1200)),
|
||||||
|
('external', models.CharField(blank=True, default='', max_length=255)),
|
||||||
|
('let_yeahnotifs', models.BooleanField(default=True)),
|
||||||
|
('let_freedom', models.BooleanField(default=True)),
|
||||||
|
('limit_post', models.SmallIntegerField(default=0)),
|
||||||
|
('cannot_edit', models.BooleanField(default=False)),
|
||||||
|
('email_login', models.SmallIntegerField(choices=[(0, 'Do not allow'), (1, 'Okay'), (2, 'Only allow')], default=1)),
|
||||||
|
('adopted', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('favorite', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='closedverse_main.post')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='PollVote',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('done', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('choice', models.SmallIntegerField(default=0)),
|
||||||
|
('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.poll')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Notification',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('read', models.BooleanField(default=False)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'Yeah on post'), (1, 'Yeah on comment'), (2, 'Comment on my post'), (3, "Comment on others' post"), (4, 'Follow to me')])),
|
||||||
|
('merges', models.TextField(blank=True, default='')),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('latest', models.DateTimeField(auto_now=True)),
|
||||||
|
('context_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.comment')),
|
||||||
|
('context_post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.post')),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_sender', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_to', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Message',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('feeling', models.SmallIntegerField(choices=[(0, 'normal'), (1, 'happy'), (2, 'wink'), (3, 'surprised'), (4, 'frustrated'), (5, 'confused'), (38, 'japan'), (39, 'lol i lied'), (69, 'adam is gay'), (70, 'I am a faggot!'), (71, 'Juice'), (72, 'Commit Suicide'), (73, 'Fresh!')], default=0)),
|
||||||
|
('body', models.TextField(null=True)),
|
||||||
|
('drawing', models.CharField(blank=True, max_length=200, null=True)),
|
||||||
|
('screenshot', models.CharField(blank=True, default='', max_length=1200, null=True)),
|
||||||
|
('url', models.URLField(blank=True, default='', max_length=1200, null=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('read', models.BooleanField(default=False)),
|
||||||
|
('is_rm', models.BooleanField(default=False)),
|
||||||
|
('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.conversation')),
|
||||||
|
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='LoginAttempt',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('success', models.BooleanField(default=False)),
|
||||||
|
('addr', models.CharField(blank=True, max_length=64, null=True)),
|
||||||
|
('user_agent', models.TextField(blank=True, null=True)),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Friendship',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('latest', models.DateTimeField(auto_now=True)),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friend_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friend_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='FriendRequest',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('body', models.TextField(blank=True, default='', null=True)),
|
||||||
|
('read', models.BooleanField(default=False)),
|
||||||
|
('finished', models.BooleanField(default=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='fr_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='fr_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Follow',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='follow_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='follow_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ConversationInvite',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('body', models.TextField(blank=True, default='', null=True)),
|
||||||
|
('read', models.BooleanField(default=False)),
|
||||||
|
('finished', models.BooleanField(default=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.conversation')),
|
||||||
|
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='convinvite_source', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='convinvite_target', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Complaint',
|
||||||
|
fields=[
|
||||||
|
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'Bug report'), (1, 'Suggestion'), (2, 'Want')])),
|
||||||
|
('body', models.TextField(blank=True, default='')),
|
||||||
|
('sex', models.SmallIntegerField(choices=[(0, 'girl'), (1, 'privileged one'), (2, '(none)')], null=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CommunityFavorite',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('community', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.community')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CommunityClink',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('kind', models.BooleanField(default=False)),
|
||||||
|
('also', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='two', to='closedverse_main.community')),
|
||||||
|
('root', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='one', to='closedverse_main.community')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='community',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.community'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='creator',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='original_post',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='closedverse_main.post'),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='AuditLog',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('type', models.SmallIntegerField(choices=[(0, 'Post delete'), (1, 'Comment delete'), (2, 'User edit'), (3, 'Generate passwd reset'), (4, 'User delete'), (5, 'Image delete'), (6, 'Purge 1'), (7, 'Purge 2'), (8, 'Purge 3'), (9, 'Purge 4'), (10, 'Purge 5'), (11, 'Un-purge 1'), (12, 'Changed server settings')])),
|
||||||
|
('reasoning', models.TextField(blank=True, default='', null=True)),
|
||||||
|
('by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='audit_by', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='audit_comment', to='closedverse_main.comment')),
|
||||||
|
('post', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='audit_post', to='closedverse_main.post')),
|
||||||
|
('reversed_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='audit_reverse_by', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='audit_user', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2023-02-08 00:56
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('closedverse_main', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MetaViews',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('from_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='from_user', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('target_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='target_user', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
|||||||
|
import json
|
||||||
|
class CommunitySerializer():
|
||||||
|
"""
|
||||||
|
Serializes communities for use with JSON
|
||||||
|
"""
|
||||||
|
@staticmethod
|
||||||
|
def single(community):
|
||||||
|
"""
|
||||||
|
Return one dict for a community, meant to be used in community pages, etc
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
'id': community.id,
|
||||||
|
'unique_id': str(community.unique_id),
|
||||||
|
'name': community.name,
|
||||||
|
'icon': (community.icon() or None),
|
||||||
|
'banner': (community.banner or None),
|
||||||
|
'description': community.description,
|
||||||
|
'type': community.type,
|
||||||
|
'platform': community.platform,
|
||||||
|
'allowed_users': json.loads(community.allowed_users) if community.allowed_users else None,
|
||||||
|
'creator': community.creator_id
|
||||||
|
}
|
||||||
|
@staticmethod
|
||||||
|
def many(queryset):
|
||||||
|
"""
|
||||||
|
Return a community meant to be used in a bigger list, etc
|
||||||
|
"""
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
'id': community.id,
|
||||||
|
'name': community.name,
|
||||||
|
'icon': (community.icon() or None),
|
||||||
|
'banner': (community.banner or None),
|
||||||
|
'type': community.type,
|
||||||
|
'platform': community.platform
|
||||||
|
} for community in queryset
|
||||||
|
]
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% block main-body %}
|
||||||
|
{% nocontent "403 Forbidden" %}
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% block main-body %}
|
||||||
|
{% nocontent "If you're not careful and you noclip out of reality in the wrong areas, you'll end up in the Backrooms, where it's nothing but the stink of old moist carpet, the madness of mono-yellow, the endless background noise of fluorescent lights at maximum hum-buzz, and approximately six hundred million square miles of randomly segmented empty rooms to be trapped in. God save you if you hear something wandering around nearby, because it sure as hell has heard you." %}
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% load closedverse_user %}{% load closedverse_community %}{% load closedverse_tags %}
|
||||||
|
{% block main-body %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column">
|
||||||
|
<div class="headline">
|
||||||
|
<h2 class="headline-text">
|
||||||
|
<span class="symbol activity-headline">Activity Feed</span>
|
||||||
|
</h2>
|
||||||
|
<div class="post-filter">
|
||||||
|
<form method="GET">
|
||||||
|
<input type="checkbox" name="my" value="{% if request.session.activity_no_my %}n{% else %}1{% endif %}"{% if not request.session.activity_no_my %} checked{% endif %}> Show my own posts
|
||||||
|
<input type="checkbox" name="ds" value="{% if request.session.activity_ds %}n{% else %}1{% endif %}"{% if request.session.activity_ds %} checked{% endif %}> Show one of each person's posts
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="search" action="{% url "main:user-search" %}">
|
||||||
|
<input type="text" name="query" title="Search users" placeholder="Search users" minlength="2" maxlength="16">
|
||||||
|
<input type="submit" value="q" title="Search">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% if community %}
|
||||||
|
<div class="post-form none">
|
||||||
|
{% post_form request.user community %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div id="js-main">
|
||||||
|
<div class="activity-feed content-loading-window">
|
||||||
|
<div>
|
||||||
|
{% discordapp_spinner %}
|
||||||
|
<p class="tleft"><span>Loading activity feed...</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="activity-feed content-load-error-window none">
|
||||||
|
<div>
|
||||||
|
<p>The activity feed couldn't be loaded. Check your Internet connection, wait a moment, and then try reloading.</p>
|
||||||
|
<div class="buttons-content"><a href="{% url "main:activity" %}" class="button">Reload</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{% load closedverse_user %}{% u_post_list posts next 2 %}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div id="help" class="main-column">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Change password</h2>
|
||||||
|
<form class="setting-form" method="post" action={% url "main:change-password-set" %}>
|
||||||
|
<p>You can change your password here</p>
|
||||||
|
<li class="setting">
|
||||||
|
<p class="settings-label">Old Password:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="password" name="old-password" maxlength="100" placeholder="Old Password">
|
||||||
|
</div>
|
||||||
|
<p class="settings-label">New Password:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="password" name="new-password" maxlength="100" placeholder="New Password">
|
||||||
|
</div>
|
||||||
|
<p class="settings-label">Confirm Password:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="password" name="confirm-password" maxlength="100" placeholder="Confirm Password">
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button apply-button" value="Confirm">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% load closedverse_community %}{% block main-body %}
|
||||||
|
<div class="main-column">
|
||||||
|
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<a class="post-permalink-button info-ticker" href="{% url "main:post-view" comment.original_post.id %}">
|
||||||
|
<span class="icon-container"><img src="{% avatar comment.original_post.creator comment.original_post.feeling %}" class="icon"></span>
|
||||||
|
<span>View <span class="post-user-description" {% if comment.original_post.creator.color %}style=color:{{ comment.original_post.creator.color }}{% endif %}>{{ comment.original_post.creator.nickname }}'s post ({{ comment.original_post.trun|truncatechars:35 }})</span> for this comment.</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="post-list-outline more">
|
||||||
|
<div id="post-content" class="post reply-permalink-post">
|
||||||
|
<div id="{{ comment.unique_id }}" class="other">
|
||||||
|
<p class="community-container"><a {% if comment.community.clickable %}href="{% url "main:community-view" comment.community.id %}"{% endif %}><img src="{{ comment.community.icon }}" class="community-icon">{{ comment.community.name }}</a></p>
|
||||||
|
{% if comment.is_mine or comment.can_rm %}
|
||||||
|
{% if user.is_active %}
|
||||||
|
<div class="edit-buttons-content">
|
||||||
|
<button type="button" class="symbol button edit-button rm-post-button" data-action="{% url "main:comment-rm" comment.id %}"><span class="symbol-label">Delete</span></button>
|
||||||
|
{% if comment.is_mine and not comment.has_edit %}
|
||||||
|
<button type="button" class="symbol button edit-button edit-post-button"><span class="symbol-label">Edit</span></button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="user-content">
|
||||||
|
{% user_icon_container comment.creator comment.feeling %}
|
||||||
|
<div class="user-name-content">
|
||||||
|
<p class="user-name"><a {% if comment.creator.color %}style=color:{{ comment.creator.color }}{% endif %} href="{% url "main:user-view" comment.creator.username %}">{{ comment.creator.nickname }}</a></p>
|
||||||
|
{% if not comment.creator.is_active %}
|
||||||
|
<p style="color: #f00;">Banned</p>
|
||||||
|
{% endif %}
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<span class="spoiler-status{% if comment.spoils %} spoiler{% endif %}">Spoilers ·</span>
|
||||||
|
<span class="timestamp">{% time comment.created %}</span>
|
||||||
|
{% if comment.drawing %}
|
||||||
|
<span class="spoiler">(handwritten)</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if comment.has_edit %}
|
||||||
|
· <span class="spoiler">Edited ({% time comment.edited %})</span>
|
||||||
|
{% endif %}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
{% if comment.is_mine %}
|
||||||
|
<div id="post-edit" class="none">
|
||||||
|
<form data-action="{% url "main:comment-change" comment.id %}" id="edit-form" method="post">
|
||||||
|
{% feeling_selector comment.feeling %}
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea name="body" class="textarea-text textarea " maxlength="2200" placeholder="Edit your comment." data-required="">{{ comment.body }}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="post-form-footer-options">
|
||||||
|
<label class="spoiler-button symbol"><input id="is_spoiler" name="is_spoiler" type="checkbox" value="1"{% if comment.spoils %} checked{% endif %}>Spoilers</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-buttons">
|
||||||
|
<button type="button" class="cancel-button gray-button">Cancel</button>
|
||||||
|
<button type="submit" class="post-button black-button">Submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div id="the-post">
|
||||||
|
{% if comment.drawing %}
|
||||||
|
<p class="reply-content-memo"><img src="{{ comment.drawing }}" class="post-memo"></p>
|
||||||
|
{% else %}
|
||||||
|
<p class="reply-content-text">{{ comment.body|linebreaksbr }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if comment.screenshot %}
|
||||||
|
<div class="screenshot-container still-image"><img src="{{ comment.screenshot }}"></div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="post-meta">
|
||||||
|
<button type="button"{% if not comment.can_yeah %} disabled{% endif %} class="symbol submit yeah-button
|
||||||
|
{% if comment.has_yeah %}empathy-added{% endif %}
|
||||||
|
" data-feeling="" data-action="{% url "main:comment-add-yeah" comment.id %}" data-url-id="{{ comment.id }}"><span class="yeah-button-text">{% empathy_txt comment.feeling comment.has_yeah %}</span></button>
|
||||||
|
<div class="empathy symbol"><span class="symbol-label">Yeahs</span><span class="empathy-count">{{ comment.number_yeahs }}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% empathy_content yeahs request comment.has_yeah %}
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% block main-body %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">Search Communities</h2>
|
||||||
|
<form class="search user-search" action="{% url "main:community-search" %}">
|
||||||
|
<input type="text" name="query" value="{{ query }}" placeholder="Mario, etc." minlength="1" maxlength="16">
|
||||||
|
<input type="submit" value="q" title="Search">
|
||||||
|
</form>
|
||||||
|
{% if communities %}
|
||||||
|
<div class="search-content">
|
||||||
|
<p class="user-found note">{{ communities|length }} result{% if not communities|length == 1 %}s{% endif %} found for "{{ query }}"</p>
|
||||||
|
<ul class="list community-list community-card-list">
|
||||||
|
{% for community in communities %}
|
||||||
|
<li id="{{ community }}" class="trigger test-community-list-item " data-href="{% url "main:community-view" community.id %}" tabindex="0">
|
||||||
|
{% if community.banner %}
|
||||||
|
<img src="{{ community.banner.url }}" class="community-list-cover">
|
||||||
|
{% endif %}
|
||||||
|
<div class="community-list-body">
|
||||||
|
<span class="icon-container"><img src="{{ community.icon }}" class="icon"></span>
|
||||||
|
<div class="body">
|
||||||
|
<a class="title" href="{% url "main:community-view" community.id %}" tabindex="-1">{{ community.name }}</a>
|
||||||
|
|
||||||
|
<span class="platform-tag">
|
||||||
|
{% if community.type_platform %}{% load static %} <img src="{% static community.type_platform %}">{% endif %}
|
||||||
|
</span>
|
||||||
|
<span class="text">{{ community.type_txt }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="no-content search-content">
|
||||||
|
<div class="search-content no-title-content">
|
||||||
|
<p>"{{ query }}" could not be found.<br>
|
||||||
|
Try searching for something different.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% load closedverse_community %}{% block main-body %}
|
||||||
|
<div class="community-main">
|
||||||
|
</div>
|
||||||
|
<div class="community-top-sidebar">
|
||||||
|
<div class="post-list-outline index-memo">
|
||||||
|
<h2 class="label">Community creation Q&A</h2>
|
||||||
|
<h2>Why?</h2>
|
||||||
|
<p>I have no idea, I guess it's cool to have. You can have your own little corner of this site now...</p>
|
||||||
|
<h2>What can I do with my own community?</h2>
|
||||||
|
<p>You can edit it, and that's basically it.</p>
|
||||||
|
<h2>What are C-Tokens, and how do I get them?</h2>
|
||||||
|
<p>Community tokens are a stupid and overcomplicated method of preventing 200,000 communities from being made by one person. You get one when signing up, and you can use it to make your own community. You'll have to ask a staff member for more C-Tokens if you want to make more communities. </p>
|
||||||
|
<h2>Any future plans?</h2>
|
||||||
|
<p>Fuck, I got no clue. Maybe I should make C-Tokens tradable, or make a community ban system, so you can block people from posting and commenting in your own communities.</p>
|
||||||
|
</div>
|
||||||
|
{% if request.user.c_tokens > 0 %}<a class="big-button" href={% url "main:community-create" %}><span class="symbol-label">Create a community</span></a>{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="community-main">
|
||||||
|
<br>
|
||||||
|
<div class="community-switcher">
|
||||||
|
<a class="community-switcher-tab gen selected" href="#">General</a>
|
||||||
|
<a class="community-switcher-tab game" href="#">Game</a>
|
||||||
|
<a class="community-switcher-tab special" href="#">Special</a>
|
||||||
|
<a class="community-switcher-tab usr" href="#">User</a>
|
||||||
|
</div>
|
||||||
|
<div class="communities gen">
|
||||||
|
{% community_page_element general "General Communities" %}
|
||||||
|
</div>
|
||||||
|
<div class="communities game none">
|
||||||
|
{% community_page_element game "Game Communities" %}
|
||||||
|
</div>
|
||||||
|
<div class="communities special none">
|
||||||
|
{% community_page_element special "Special Communities" %}
|
||||||
|
</div>
|
||||||
|
<div class="communities usr none">
|
||||||
|
{% community_page_element user_communities "User Communities" %}
|
||||||
|
</div>
|
||||||
|
{% if has_next %}
|
||||||
|
<a href="{% url "main:community-viewall" %}?offset={{ next }}" class="big-button">Next</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_back %}
|
||||||
|
<p> </p>
|
||||||
|
<a href="{% url "main:community-viewall" %}?offset={{ back }}" class="big-button">Back</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_tags %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">Create a new community</h2>
|
||||||
|
<form class="setting-form" method="post" action={% url "main:community-create-action" %}>
|
||||||
|
<p>Create your own community that you can edit here! Each community will cost you one Community Token.</p>
|
||||||
|
<li class="setting-community-name">
|
||||||
|
<p class="settings-label">Set name:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="community_name" maxlength="32" placeholder="New Name" value="{{ community.name }}">
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="setting-community-description">
|
||||||
|
<p class="settings-label">Community description:</p>
|
||||||
|
<textarea class="textarea" name="community_description" maxlength="2200" placeholder="Community description">{{ community.description }}</textarea>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="community_platform">Platform</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="community_platform" id="community_platform">
|
||||||
|
<option value="0"{% if community.platform == 0 %} selected{% endif %}>None</option>
|
||||||
|
<option value="1"{% if community.platform == 1 %} selected{% endif %}>3DS</option>
|
||||||
|
<option value="2"{% if community.platform == 2 %} selected{% endif %}>Wii U</option>
|
||||||
|
<option value="3"{% if community.platform == 3 %} selected{% endif %}>Switch</option>
|
||||||
|
<option value="4"{% if community.platform == 4 %} selected{% endif %}>3DS and Wii U</option>
|
||||||
|
<option value="5"{% if community.platform == 5 %} selected{% endif %}>PC</option>
|
||||||
|
<option value="6"{% if community.platform == 6 %} selected{% endif %}>Xbox</option>
|
||||||
|
<option value="7"{% if community.platform == 7 %} selected{% endif %}>Playstation</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button apply-button" value="Save">
|
||||||
|
<p class="note">You have {{ tokens }} token(s) remaining</p>
|
||||||
|
<p class="note">I'm too lazy to add the remaining settings in here for now, but you can change them after making the community. Oh yeah, also if your community gets removed by a staff member, you won't get your token back, so don't make communities that break the rules or whatever.</p>
|
||||||
|
</div>
|
||||||
|
</form></div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_community %}
|
||||||
|
{% user_sidebar request user profile 0 %}
|
||||||
|
<div class="main-column post-list-outline">
|
||||||
|
<h2 class="label">{% if other %}{{ user.nickname }}'s favorite{% else %}Favorite{% endif %} communities</h2>
|
||||||
|
{% community_page_element favorites None %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% load closedverse_community %}{% block main-body %}
|
||||||
|
<div class="community-main">
|
||||||
|
<div id="community-eyecatch"></div>
|
||||||
|
</div>
|
||||||
|
<div class="community-top-sidebar">
|
||||||
|
<form action="{% url "main:community-search" %}" class="search">
|
||||||
|
<input maxlength="32" name="query" placeholder="Search all communities" type="text"><input title="Search" type="submit" value="q">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% if user.is_warned %}
|
||||||
|
<div class="notice" style="background-color: #ffc783;border: 1px solid #ffb358;">
|
||||||
|
<p><b>WARNING</b>: You have been issued a warning by an administrator. No features have been restricted, as this is just a warning.
|
||||||
|
<div>
|
||||||
|
{% if user.get_warned_reason %}
|
||||||
|
<p>Reason: "{{ user.get_warned_reason }}"</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if availablemotds and request.user.is_authenticated %}
|
||||||
|
<div class="post-list-outline index-memo">
|
||||||
|
<h2 class="label">MOTD / News</h2>
|
||||||
|
{% for mesoftheday in mesoftheday %}
|
||||||
|
{% if mesoftheday.Title %}<h2>{{ mesoftheday.Title }}</h2>{% endif %}
|
||||||
|
<p>{{ mesoftheday.message|linebreaksbr|urlize }}</p>
|
||||||
|
{% if mesoftheday.image %}<image src={{ mesoftheday.image.url }}></image>{% endif %}
|
||||||
|
{% if mesoftheday.hide_date == False %}<p class="memo-date">Posted {{ mesoftheday.created }}</p>{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if availablemes and not request.user.is_authenticated %}
|
||||||
|
<div class="post-list-outline index-memo">
|
||||||
|
<h2 class="label">Welcome to Cedar!</h2>
|
||||||
|
{% for welmes in welmes %}
|
||||||
|
<h2>{{ welmes.Title }}</h2>
|
||||||
|
<p>{{ welmes.message|linebreaksbr|urlize }}</p>
|
||||||
|
{% if welmes.image %}<image src={{ welmes.image.url }}></image>{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if request.user.c_tokens > 0 %}<a class="big-button" href={% url "main:community-create" %}><span class="symbol-label">Create a community</span></a>{% endif %}
|
||||||
|
<!--
|
||||||
|
<iframe src="https://discord.com/widget?id=1001294283040620665&theme=dark" height="300" allowtransparency="true" frameborder="0" sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"></iframe>
|
||||||
|
-->
|
||||||
|
{% if availableads %}
|
||||||
|
<div class="adx">
|
||||||
|
<h3>User-Generated Ad</h3>
|
||||||
|
<p><a href="/help/whatads">What are user-generated ads?</a></p>
|
||||||
|
<a href="{{ ad.url }}"><img src="{{ ad.imageurl.url }}"></a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="community-main">
|
||||||
|
{% if favorites %}
|
||||||
|
<h3 class="community-title symbol community-favorite-title">Favorite communities</h3>
|
||||||
|
<div class="card" id="community-favorite">
|
||||||
|
<ul>
|
||||||
|
{% for favorite in favorites %}
|
||||||
|
<li class="test-favorite-community">
|
||||||
|
<a href="{% url "main:community-view" favorite.id %}" class="icon-container">
|
||||||
|
<img src="{{ favorite.icon }}" class="icon">
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<li class="read-more">
|
||||||
|
<a href="{% url "main:community-favorites" %}" class="favorite-community-link symbol"><span class="symbol-label">Show more</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if feature %}
|
||||||
|
{% community_page_element feature "Featured Communities" True %}
|
||||||
|
{% endif %}
|
||||||
|
{% community_page_element general "General Communities" %}
|
||||||
|
{% community_page_element game "Game Communities" %}
|
||||||
|
{% community_page_element special "Special Communities" %}
|
||||||
|
{% community_page_element user_communities "User owned Communities" %}
|
||||||
|
<a href="{% url "main:community-viewall" %}" class="big-button">Show more</a>
|
||||||
|
</div>
|
||||||
|
<div id="community-guide-footer">
|
||||||
|
<div id="guide-menu">
|
||||||
|
<a class="arrow-button" href="{% url "main:help-why" %}"><span>Why join?</span></a>
|
||||||
|
<a class="arrow-button" href="{% url "main:help-rules" %}"><span>Cedar Rules</span></a>
|
||||||
|
<!--<a class="arrow-button" href="{% url "main:active-clones" %}"><span>Active clones</span></a>-->
|
||||||
|
<a class="arrow-button" href="{% url "main:help-faq" %}"><span>Frequently Asked Questions (FAQ)</span></a>
|
||||||
|
<a class="arrow-button" href="{% url "main:what-ads" %}"><span>What are user-generated ads?</span></a>
|
||||||
|
{% if settings.PROD %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_tags %}{% load closedverse_community %}
|
||||||
|
{% if community.is_feature %}<div class='notice'>
|
||||||
|
<p>Who the fuck gave you ownership of a fucking featured community!</p>
|
||||||
|
</div>{% endif %}
|
||||||
|
{% community_sidebar community request %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">Change settings for {{ community.creator }}'s community</h2>
|
||||||
|
<form class="setting-form" method="post" action={% url "main:community-tools-set" community.id %}>
|
||||||
|
<li class="setting-community-name">
|
||||||
|
<p class="settings-label">Set name:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="community_name" maxlength="32" placeholder="New Name" value="{{ community.name }}">
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="setting-community-description">
|
||||||
|
<p class="settings-label">Community description:</p>
|
||||||
|
<textarea class="textarea" name="community_description" maxlength="2200" placeholder="Community description">{{ community.description }}</textarea>
|
||||||
|
</li>
|
||||||
|
{% if request.user.has_freedom %}
|
||||||
|
<li class="setting-community-icon">
|
||||||
|
<label class="file-button-container">
|
||||||
|
<p class="input-label">Community icon: {{ max_icon_size }}MB</p>
|
||||||
|
<span class="button file-upload-button">Upload a new icon</span>
|
||||||
|
<input accept="image/gif, image/png, image/webp, image/jpeg, image/jpg, image/svg+xml, image/bmp" type="file" style="display: none;" name="community_icon" onchange="loadFile(event)" id="upload-file">
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
<li class="setting-community-banner">
|
||||||
|
<label class="file-button-container">
|
||||||
|
<p class="input-label">Community banner: {{ max_banner_size }}MB</p>
|
||||||
|
<span class="button file-upload-button">Upload a new banner</span>
|
||||||
|
<input accept="image/gif, image/png, image/webp, image/jpeg, image/jpg, image/svg+xml, image/bmp" type="file" style="display: none;" name="community_banner" onchange="loadFile(event)" id="upload-file">
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<p> </p>
|
||||||
|
<input type="checkbox" name="force_login" {% if community.require_auth %}checked{% endif %}>Require login:
|
||||||
|
<p class="note">If this is on, users will need to sign in to view your community.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label">Platform</p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="community_platform" id="community_platform">
|
||||||
|
<option value="0"{% if community.platform == 0 %} selected{% endif %}>None</option>
|
||||||
|
<option value="1"{% if community.platform == 1 %} selected{% endif %}>3DS</option>
|
||||||
|
<option value="2"{% if community.platform == 2 %} selected{% endif %}>Wii U</option>
|
||||||
|
<option value="3"{% if community.platform == 3 %} selected{% endif %}>Switch</option>
|
||||||
|
<option value="4"{% if community.platform == 4 %} selected{% endif %}>3DS and Wii U</option>
|
||||||
|
<option value="5"{% if community.platform == 5 %} selected{% endif %}>PC</option>
|
||||||
|
<option value="6"{% if community.platform == 6 %} selected{% endif %}>Xbox</option>
|
||||||
|
<option value="7"{% if community.platform == 7 %} selected{% endif %}>Playstation</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="note">If your community is for a video game, you can set the platform here. This will show an icon corresponding to what platform you pick.</p>
|
||||||
|
</li>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button apply-button" value="Save">
|
||||||
|
</div>
|
||||||
|
</form></div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}{% block main-body %}{% load closedverse_community %}
|
||||||
|
{% community_sidebar community request %}
|
||||||
|
<div class="main-column">
|
||||||
|
{% if user.is_warned and user.is_authenticated and user.is_active %}
|
||||||
|
<div class="notice" style="background-color: #ffc783;border: 1px solid #ffb358;">
|
||||||
|
<p><b>WARNING</b>: You have been issued a warning by an administrator. No features have been restricted, as this is just a warning.
|
||||||
|
<div>
|
||||||
|
{% if user.get_warned_reason %}
|
||||||
|
<p>Reason: "{{ user.get_warned_reason }}"</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">{{ community.name }}:</h2>
|
||||||
|
{% if request.user.is_authenticated and community.post_perm %}
|
||||||
|
{% post_form request.user community %}
|
||||||
|
{% endif %}
|
||||||
|
<div class="body-content" id="community-post-list">
|
||||||
|
{% post_list posts next %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
{% load closedverse_community %}<form id="reply-form" class="for-identified-user" method="post" action="{% url "main:post-comments" post.id %}">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if user.is_active %}
|
||||||
|
{% if not user.limit_remaining is False %}
|
||||||
|
<div class="post-count-container">
|
||||||
|
<span>Remaining posts for today</span>
|
||||||
|
<span class="remaining-today-post-count">{{ user.limit_remaining }}</span>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% feeling_selector %}
|
||||||
|
|
||||||
|
<div class="textarea-with-menu active-text">
|
||||||
|
<menu class="textarea-menu">
|
||||||
|
<li><label class="textarea-menu-text">
|
||||||
|
<input type="radio" name="_post_type" value="body">
|
||||||
|
</label></li>
|
||||||
|
<li><label class="textarea-menu-memo">
|
||||||
|
<input type="radio" name="_post_type" value="painting">
|
||||||
|
</label></li>
|
||||||
|
</menu>
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea name="body" class="textarea-text textarea" maxlength="2200" placeholder="Add a comment here." data-required></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="textarea-memo none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% memo_drawboard %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% if user.has_freedom %}
|
||||||
|
{% file_button %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="post-form-footer-options">
|
||||||
|
<div class="post-form-footer-option-inner post-form-spoiler">
|
||||||
|
<label class="spoiler-button symbol">
|
||||||
|
<input type="checkbox" id="is_spoiler" name="is_spoiler" value="1">
|
||||||
|
Spoilers
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button reply-button disabled" value="Send" data-community-id="{{ post.community.unique_id }}" data-url-id="{{ post.id }}" data-post-content-type="text" data-post-with-screenshot="nodata" disabled="">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not user.is_active %}
|
||||||
|
<p>Your account has been disabled.</p>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{% load closedverse_tags %}{% if title %}<h3 class="community-title">{{ title }}</h3>
|
||||||
|
{% endif %}{% if communities %}
|
||||||
|
<ul class="list community-list{% if title %} community-card-list {% if feature %}test-community-list-item{% else %}device-new-community-list{% endif %}{% endif %}">
|
||||||
|
{% for community in communities %}
|
||||||
|
<li class="trigger" data-href="{% url "main:community-view" community.id %}"{% if not title %} class="test-community-list-item"{% endif %}>
|
||||||
|
{% if feature and community.banner %}
|
||||||
|
<img src="{{ community.banner.url }}" class="community-list-cover">
|
||||||
|
{% endif %}
|
||||||
|
<div class="community-list-body">
|
||||||
|
<span class="icon-container">
|
||||||
|
<img class="icon" src="{{ community.icon }}">
|
||||||
|
</span>
|
||||||
|
<div class="body">
|
||||||
|
<a class="title" href="{% url "main:community-view" community.id %}">{{ community.name }}</a>
|
||||||
|
<span class="platform-tag">
|
||||||
|
{% if community.type_platform %}{% load static %} <img src="{% static community.type_platform %}">{% endif %}
|
||||||
|
</span>
|
||||||
|
<span class="text">{{ community.type_txt }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
{% if title %}<div class="post-list-outline">{% endif %}
|
||||||
|
{% if title %}
|
||||||
|
{% nocontent "No communities of this type have been created yet." %}
|
||||||
|
{% else %}
|
||||||
|
{% nocontent "You haven't favorited any communities yet. Use the favorite button in a community to add it here." %}
|
||||||
|
{% endif %}
|
||||||
|
{% if title %}</div>{% endif %}
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
{% if not post.is_rm %}
|
||||||
|
{% load closedverse_tags %}<div id="{{ post.unique_id }}" {% if post.spoils or not post.creator.is_active %}data-href-hidden{% else %}data-href{% endif %}="{% if post.is_reply %}{% url "main:comment-view" post.id %}{% else %}{% url "main:post-view" post.id %}{% endif %}" class="post post-subtype-default trigger{% if post.spoils or not post.creator.is_active %} hidden test-hidden{% endif %}{% if type == 2 %} post-list-outline{% endif %}" tabindex="0">
|
||||||
|
{% if with_community_container %}
|
||||||
|
<p class="community-container">
|
||||||
|
{% if post.is_reply %}
|
||||||
|
<a class="test-community-link" href="{% url "main:post-view" post.original_post_id %}"><img src="{% avatar post.original_post.creator post.original_post.feeling %}" class="community-icon">
|
||||||
|
<span class="reply symbol"></span>Comment on {{ post.original_post.creator.nickname }}'s post</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="test-community-link" {% if post.community.clickable %}href="{% url "main:community-view" post.community_id %}"{% endif %}><img src="{{ post.community.icon }}" class="community-icon">{{ post.community.name }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% user_icon_container post.creator post.feeling %}
|
||||||
|
{% if post.creator == post.community.creator %}
|
||||||
|
<span class="owner-label">Community Owner</span>
|
||||||
|
{% endif %}
|
||||||
|
<p class="user-name"><a href="{% url "main:user-view" post.creator.username %}"{% if post.creator.color %}style=color:{{ post.creator.color }}{% endif %}>{{ post.creator.nickname }}</a></p>
|
||||||
|
{% if not post.creator.is_active %}
|
||||||
|
<p style="color: #f00;">Banned</p>
|
||||||
|
{% endif %}
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<span class="spoiler-status{% if post.spoils %} spoiler{% endif %}">Spoilers·</span>
|
||||||
|
{% if post.has_edit %}
|
||||||
|
<span class="spoiler">Edited</span>·
|
||||||
|
{% endif %}
|
||||||
|
<a class="timestamp" {% if post.spoils and not post.is_mine %}data-href-hidden{% else %}href{% endif %}="{% if post.is_reply %}{% url "main:comment-view" post.id %}{% else %}{% url "main:post-view" post.id %}{% endif %}">{% time post.created %}</a>
|
||||||
|
{% if post.drawing %}
|
||||||
|
<span class="spoiler">(handwritten)</span>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
<div class="body post-content">
|
||||||
|
{% if post.yt_vid %}
|
||||||
|
<a href="{% url "main:post-view" post.id %}" class="screenshot-container video"><img height="48" src="https://i.ytimg.com/vi/{{ post.yt_vid }}/default.jpg"></a>
|
||||||
|
{% endif %}
|
||||||
|
{% if post.drawing %}
|
||||||
|
<p class="post-content-memo"><img src="{{ post.drawing }}" class="post-memo"></p>
|
||||||
|
{% else %}
|
||||||
|
{% if post.has_line_trun %}
|
||||||
|
<p class="post-content-text">{{ post.body|truncatechars:200 }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="post-content-text">{{ post.body|truncatechars:200|linebreaksbr }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if post.screenshot %}<a class="screenshot-container still-image" href="{% if post.is_reply %}{% url "main:comment-view" post.id %}{% else %}{% url "main:post-view" post.id %}{% endif %}"><img src="{{ post.screenshot }}"></a>{% endif %}
|
||||||
|
{% if post.spoils and post.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>This post contains spoilers.</p>
|
||||||
|
<button type="button" class="hidden-content-button">View Post</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if not post.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>Content hidden because its creator was banned. </p>
|
||||||
|
{% if post.creator.get_warned_reason %}
|
||||||
|
<p>Reason: {{post.creator.get_warned_reason}}
|
||||||
|
{% endif %}
|
||||||
|
<button type="button" class="hidden-content-button">View Anyway</button>
|
||||||
|
</p></div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="post-meta">
|
||||||
|
<button type="button" {% if not post.can_yeah %}disabled{% endif %} class="symbol submit yeah-button
|
||||||
|
{% if post.has_yeah %}empathy-added{% endif %}
|
||||||
|
" data-feeling="" data-action="{% if post.is_reply %}{% url "main:comment-add-yeah" post.id %}{% else %}{% url "main:post-add-yeah" post.id %}{% endif %}" data-url-id="{{ post.id }}"><span class="yeah-button-text">{% empathy_txt post.feeling post.has_yeah %}</span></button>
|
||||||
|
{% if post.url %}
|
||||||
|
<a class="link-confirm symbol button" href="{{ post.url }}"></a>
|
||||||
|
{% endif %}
|
||||||
|
<div class="empathy symbol"><span class="symbol-label">Yeahs</span><span class="empathy-count">{{ post.number_yeahs }}</span></div>
|
||||||
|
{% if not post.original_post %}
|
||||||
|
<div class="reply symbol"><span class="symbol-label">Comments</span><span class="reply-count">{{ post.number_comments }}</span></div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if post.recent_comment and post.recent_comment.creator.is_active %}
|
||||||
|
<div class="recent-reply-content">
|
||||||
|
{% if post.number_comments > 1 %}
|
||||||
|
<div class="recent-reply-read-more-container" tabindex="0">
|
||||||
|
View all comments ({{ post.number_comments }})
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div id="{{ post.recent_comment.unique_id }}" tabindex="0" class="recent-reply trigger">
|
||||||
|
{% user_icon_container post.recent_comment.creator post.recent_comment.feeling %}
|
||||||
|
<p class="user-name"><a href="{% url "main:user-view" post.recent_comment.creator.username %}">{{ post.recent_comment.creator.nickname }}</a></p>
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<a class="timestamp" href="{% url "main:comment-view" post.recent_comment.id %}">{% time post.recent_comment.created %}</a>
|
||||||
|
</p>
|
||||||
|
<div class="body">
|
||||||
|
<div class="post-content">
|
||||||
|
{% if post.recent_comment.drawing %}
|
||||||
|
<p class="recent-reply-content-memo"><img src="{{ post.recent_comment.drawing }}" class="recent-reply-memo"></p>
|
||||||
|
{% else %}
|
||||||
|
<p class="recent-reply-content-text">{{ post.recent_comment.body }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<div id="sidebar">
|
||||||
|
<section class="sidebar-container" id="sidebar-community">
|
||||||
|
{% if community.banner %}
|
||||||
|
<span id="sidebar-cover">
|
||||||
|
<a href="{% url "main:community-view" community.id %}">
|
||||||
|
<img src="{{ community.banner.url }}">
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
<header id="sidebar-community-body">
|
||||||
|
<span id="sidebar-community-img">
|
||||||
|
<span class="icon-container">
|
||||||
|
<a href="{% url "main:community-view" community.id %}">
|
||||||
|
<img src="{{ community.icon }}" class="icon">
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span class="platform-tag">
|
||||||
|
{% if community.type_platform %}{% load static %} <img src="{% static community.type_platform %}">{% endif %}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
{% if community.tags == 'announcements' %}
|
||||||
|
<span class="news-community-badge">Announcement Community</span>
|
||||||
|
{% elif community.tags == 'changelog' %}
|
||||||
|
<span class="news-community-badge">Changelog Community</span>
|
||||||
|
{% elif community.tags == 'general' %}
|
||||||
|
<span class="news-community-badge">General</span>
|
||||||
|
{% endif %}
|
||||||
|
<h1 class="community-name">
|
||||||
|
<a href="{% url "main:community-view" community.id %}">{{ community.name }}
|
||||||
|
</a> </h1>
|
||||||
|
</header>
|
||||||
|
{% if community.description %}
|
||||||
|
<div class="community-description js-community-description">
|
||||||
|
<p class="text js-truncated-text">{{ community.description|linebreaksbr|urlize }}</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if request.user.is_authenticated %}
|
||||||
|
<button type="button" class="symbol button favorite-button{% if community.has_favorite %} checked{% endif %}" data-action-favorite="{% url "main:community-favorite-add" community.id %}" data-action-unfavorite="{% url "main:community-favorite-rm" community.id %}"><span class="favorite-button-text">Favorite</span></button>
|
||||||
|
<!--<button class="button reload-btn">Refresh posts</button>
|
||||||
|
-->
|
||||||
|
{% if request.user == community.creator %}
|
||||||
|
<button class="button" data-href="{% url "main:community-tools" community.id %}">Community Settings</button>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<p>I'm loading it !</p>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{% load closedverse_tags %}<div id="empathy-content"{% if not yeahs %} class="none"{% endif %}>
|
||||||
|
{% if myself.is_authenticated %}<a href="{% url "main:user-view" myself.username %}" class="post-permalink-feeling-icon visitor {% user_class myself %}"{% if not has_yeah %} style="display: none;"{% endif %}><img src="{% avatar myself %}" class="user-icon"></a>{% endif %}
|
||||||
|
{% for yeah in yeahs %}{% if not myself.is_authenticated or not yeah.by == myself %}
|
||||||
|
<a href="{% url "main:user-view" yeah.by.username %}" class="post-permalink-feeling-icon {% user_class yeah.by %}"><img src="{% avatar yeah.by yeah.feeling %}" class="user-icon"></a>
|
||||||
|
{% endif %}{% endfor %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<div class="feeling-selector js-feeling-selector test-feeling-selector"><label class="symbol feeling-button feeling-button-normal checked"><input type="radio" name="feeling_id" value="0"{% if val == 0 %} checked{% endif %}><span class="symbol-label">normal</span></label><label class="symbol feeling-button feeling-button-happy"><input type="radio" name="feeling_id" value="1"{% if val == 1 %} checked{% endif %}><span class="symbol-label">happy</span></label><label class="symbol feeling-button feeling-button-like"><input type="radio" name="feeling_id" value="2"{% if val == 2 %} checked{% endif %}><span class="symbol-label">like</span></label><label class="symbol feeling-button feeling-button-surprised"><input type="radio" name="feeling_id" value="3"{% if val == 3 %} checked{% endif %}><span class="symbol-label">surprised</span></label><label class="symbol feeling-button feeling-button-frustrated"><input type="radio" name="feeling_id" value="4"{% if val == 4 %} checked{% endif %}><span class="symbol-label">frustrated</span></label><label class="symbol feeling-button feeling-button-puzzled"><input type="radio" name="feeling_id" value="5"{% if val == 5 %} checked{% endif %}><span class="symbol-label">puzzled</span></label>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
<!-- <div class="file-button-container">
|
||||||
|
<span class="input-div">Image <span>PNG, JPG, and GIF are allowed.</span></span>
|
||||||
|
<input type="file" class="file-button" accept="image/png, image/jpeg, image/jpg, image/svg+xml, image/bmp, image/gif">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
<label class="file-button-container">
|
||||||
|
<span class="input-label">Image <span id="image-dimensions">PNG, JPG, JPEG and GIF are allowed.</span></span>
|
||||||
|
<span class="button file-upload-button">Upload</span>
|
||||||
|
<input accept="image/gif, image/png, image/jpeg, image/jpg, image/svg+xml, image/bmp" type="file" style="display: none;" id="upload-file">
|
||||||
|
<input type="hidden" id="upload-input" name="screen">
|
||||||
|
<div id="upload-preview-container" class="screenshot-container still-image" style="display: none;">
|
||||||
|
<img id="upload-preview">
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{% load closedverse_tags %}{% load closedverse_user %}<div class="dialog none" data-modal-types="accept-friend-request" uuid="{{ fr.unique_id }}" data-screen-name="{{ fr.source.nickname }}" data-reject-action="{% url "main:user-fr-reject" fr.source.username %}" data-action="{% url "main:user-fr-accept" fr.source.username %}">
|
||||||
|
<div class="dialog-inner">
|
||||||
|
<div class="window">
|
||||||
|
<h1 class="window-title">Friend Request from {{ fr.source.nickname }} at {% time fr.created True %}</h1>
|
||||||
|
<div class="window-body">
|
||||||
|
{% user_sidebar_info fr.source %}
|
||||||
|
<pre>{% if fr.body %}{{ fr.body }}{% else %}<i>(No message)</i>{% endif %}</pre>
|
||||||
|
<p class="window-body-content">Accept {{ fr.source.nickname }}'s friend request?</p>
|
||||||
|
<div class="form-buttons three">
|
||||||
|
<button class="olv-modal-close-button gray-button" data-event-type="cancel" type="button">Cancel</button><button class="cancel-button gray-button" type="button">Reject</button><button class="ok-button post-button black-button" data-event-type="ok" type="button">Accept</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<div id="memo-drawboard-page" class="dialog none">
|
||||||
|
<div class="dialog-inner">
|
||||||
|
<div class="window">
|
||||||
|
<h1 class="window-title">Drawing</h1>
|
||||||
|
<div class="window-body">
|
||||||
|
<div class="memo-buttons">
|
||||||
|
<button type="button" class="artwork-clear"></button>
|
||||||
|
<button type="button" class="artwork-undo"></button>
|
||||||
|
<button type="button" class="artwork-pencil small selected"></button>
|
||||||
|
<button type="button" class="artwork-eraser small"></button>
|
||||||
|
<button type="button" class="artwork-fill"></button>
|
||||||
|
<input type="text" class="artwork-color">
|
||||||
|
<button type="button" class="artwork-zoom"></button>
|
||||||
|
</div>
|
||||||
|
<div class="memo-canvas">
|
||||||
|
<canvas id="artwork-canvas" zoom="2"></canvas>
|
||||||
|
<canvas id="artwork-canvas-undo"></canvas>
|
||||||
|
<canvas id="artwork-canvas-redo"></canvas>
|
||||||
|
<input type="hidden" name="painting" value="">
|
||||||
|
</div>
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input class="olv-modal-close-button black-button memo-finish-btn" type="button" value="Finish">
|
||||||
|
<button type="button" class="artwork-lock none"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{% load closedverse_community %}<form id="post-form" method="post" action="{% url "main:messages-view" friend.username %}" class="folded">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if user.is_active %}
|
||||||
|
{% feeling_selector %}
|
||||||
|
<div class="textarea-with-menu active-text">
|
||||||
|
<menu class="textarea-menu">
|
||||||
|
<li><label class="textarea-menu-text">
|
||||||
|
<input type="radio" name="_post_type" value="body">
|
||||||
|
</label></li>
|
||||||
|
<li><label class="textarea-menu-memo">
|
||||||
|
<input type="radio" name="_post_type" value="painting">
|
||||||
|
</label></li>
|
||||||
|
</menu>
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea name="body" class="textarea-text textarea " maxlength="12000" placeholder="Write a message here." data-open-folded-form="" data-required=""></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="textarea-memo none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% memo_drawboard %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% if user.has_freedom %}
|
||||||
|
{% file_button %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="post-form-footer-options">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button post-button disabled" value="Send" data-post-content-type="text" disabled="">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
{% if not user.is_active %}
|
||||||
|
<p>Your account has been disabled.</p>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{% load closedverse_user %} <div class="list messages" data-next-page-url="{% if next %}?offset={{ next }}{% endif %}">
|
||||||
|
|
||||||
|
{% for post in messages %}
|
||||||
|
{% message post %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{% load markdown_deux_tags %}{% load closedverse_tags %} <div class="post scroll {% if message.mine %}my{% else %}other{% endif %}" id="{{ message.unique_id }}">
|
||||||
|
{% user_icon_container message.creator message.feeling %}
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<span class="timestamp">{% time message.created %}{% if message.read %} - Read{% endif %}</span>
|
||||||
|
<button type="button" class="symbol button edit-button rm-post-button" data-action="{% url "main:message-delete" message.unique_id %}"><span class="symbol-label">Delete</span></button>
|
||||||
|
</p>
|
||||||
|
<div class="post-body">
|
||||||
|
{% if message.drawing %}
|
||||||
|
<p class="post-content-memo"><img src="{{ message.drawing }}"></p>
|
||||||
|
{% else %}
|
||||||
|
<div class="post-content-text">{{ message.body|markdown }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if message.screenshot %}
|
||||||
|
<div class="screenshot-container still-image"><img src="{{ message.screenshot }}"></div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{% if names|length == 1 %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a>{% elif names|length == 2 %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a> and <a {% if user.1.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.1.username %}" class="nick-name">{{ names.1.nickname }}</a>{% elif names|length == 3 %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a>, <a {% if user.1.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.1.username %}" class="nick-name">{{ names.1.nickname }}</a>, and <a {% if user.2.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.2.username %}" class="nick-name">{{ names.2.nickname }}</a>{% elif names|length == 4 %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a>, <a {% if user.1.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.1.username %}" class="nick-name">{{ names.1.nickname }}</a>, <a {% if user.2.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.2.username %}" class="nick-name">{{ names.2.nickname }}</a>, and <a {% if user.3.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.3.username %}" class="nick-name">{{ names.3.nickname }}</a>{% elif names|length == 5 %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a>, <a {% if user.1.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.1.username %}" class="nick-name">{{ names.1.nickname }}</a>, <a {% if user.2.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.2.username %}" class="nick-name">{{ names.2.nickname }}</a>, <a {% if user.3.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.3.username %}" class="nick-name">{{ names.3.nickname }}</a>, and 1 other{% else %}<a {% if user.0.color %}style=color:{{ user.0.color }}{% endif %} href="{% url "main:user-view" names.0.username %}" class="nick-name">{{ names.0.nickname }}</a>, <a {% if user.1.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.1.username %}" class="nick-name">{{ names.1.nickname }}</a>, <a {% if user.2.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.2.username %}" class="nick-name">{{ names.2.nickname }}</a>, <a {% if user.3.color %}style=color:{{ user.1.color }}{% endif %} href="{% url "main:user-view" names.3.username %}" class="nick-name">{{ names.3.nickname }}</a>, and {{ nameallmn }} others{% endif %}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<div class="no-content{{ style }}">
|
||||||
|
<p>{{ text }}</p>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<p class="user-name"><a {% if user.color %}style=color:{{ user.color }}{% endif %} href="{% url "main:user-view" user.username %}">{{ user.nickname }}</a><span class="user-id">{{ user.username }}</span></p>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
{% if not comment.is_rm %}{% load closedverse_tags %}<li id="{{ comment.unique_id }}" {% if comment.spoils or not comment.creator.is_active %}data-href-hidden{% else %}data-href{% endif %}="{% url "main:comment-view" comment.id %}" class="post {% if comment.owner_post %}my{% else %}other{% endif %}{% if comment.spoils or not comment.creator.is_active %} hidden{% endif %} trigger">
|
||||||
|
{% user_icon_container comment.creator comment.feeling %}
|
||||||
|
<div class="body">
|
||||||
|
<div class="header">
|
||||||
|
<p class="user-name"><a {% if comment.creator.color %}style=color:{{ comment.creator.color }}{% endif %} href="{% url "main:user-view" comment.creator.username %}">{{ comment.creator.nickname }}</a></p>
|
||||||
|
{% if not comment.creator.is_active %}
|
||||||
|
<p style="color: #f00;">Banned</p>
|
||||||
|
{% endif %}
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<a class="timestamp" {% if comment.spoils and not comment.is_mine %}data-href-hidden{% else %}href{% endif %}="{% url "main:comment-view" comment.id %}">{% time comment.created %}</a>
|
||||||
|
{% if comment.drawing %}
|
||||||
|
<span class="spoiler">(drawing)</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if comment.has_edit %}
|
||||||
|
<span class="spoiler">· Edited</span>
|
||||||
|
{% endif %}
|
||||||
|
<span class="spoiler-status{% if comment.spoils %} spoiler{% endif %}"> · Spoilers</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if comment.drawing %}
|
||||||
|
<p class="reply-content-memo"><img src="{{ comment.drawing }}"></p>
|
||||||
|
{% else %}
|
||||||
|
<div class="reply-content-text">{{ comment.body|linebreaksbr }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if comment.screenshot %}
|
||||||
|
<div class="screenshot-container still-image"><img src="{{ comment.screenshot }}"></div>
|
||||||
|
{% endif %}
|
||||||
|
{% if comment.spoils and comment.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>This comment contains spoilers.</p>
|
||||||
|
<button type="button" class="hidden-content-button">View Comment</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if not comment.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>Content hidden because its creator was banned. </p>
|
||||||
|
{% if comment.creator.get_warned_reason %}
|
||||||
|
<p>Reason: {{comment.creator.get_warned_reason}}
|
||||||
|
{% endif %}
|
||||||
|
<button type="button" class="hidden-content-button">View Anyway</button>
|
||||||
|
</p></div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="reply-meta">
|
||||||
|
<button type="button" {% if not comment.can_yeah %}disabled{% endif %} class="symbol submit yeah-button
|
||||||
|
{% if comment.has_yeah %}empathy-added{% endif %}
|
||||||
|
" data-is-in-reply-list="1" data-feeling="" data-action="{% url "main:comment-add-yeah" comment.id %}" data-url-id="{{ comment.id }}"><span class="yeah-button-text">{% empathy_txt comment.feeling comment.has_yeah %}</span></button>
|
||||||
|
<div class="empathy symbol"><span class="symbol-label">Yeahs</span><span class="empathy-count">{{ comment.number_yeahs }}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
{% load closedverse_community %}<form id="post-form" method="post" action="{% url "main:post-create" community.id %}" class="folded for-identified-user" data-post-subtype="default" name="test-post-default-form">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="community" value="{{ community.unique_id }}">
|
||||||
|
{% if user.is_active %}
|
||||||
|
{% if not user.limit_remaining is False %}
|
||||||
|
<div class="post-count-container">
|
||||||
|
<span>Remaining posts for today</span>
|
||||||
|
<span class="remaining-today-post-count">{{ user.limit_remaining }}</span>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% feeling_selector %}
|
||||||
|
<div class="textarea-with-menu active-text">
|
||||||
|
<menu class="textarea-menu">
|
||||||
|
<li><label class="textarea-menu-text">
|
||||||
|
<input type="radio" name="_post_type" value="body">
|
||||||
|
</label></li>
|
||||||
|
<li><label class="textarea-menu-memo">
|
||||||
|
<input type="radio" name="_post_type" value="painting">
|
||||||
|
</label></li>
|
||||||
|
<!--
|
||||||
|
<li><label class="textarea-menu-poll">
|
||||||
|
<input type="radio" name="_post_type" value="poll">
|
||||||
|
</label></li>
|
||||||
|
-->
|
||||||
|
</menu>
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea name="body" class="textarea-text textarea " maxlength="2200" placeholder="{% if community.is_activity %}Share a post to your followers.{% else %}Share your thoughts in a post to {{ community.name }}{% endif %}" data-open-folded-form="" data-required=""></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="textarea-memo none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% memo_drawboard %}
|
||||||
|
<!--
|
||||||
|
<div class="textarea-poll none">
|
||||||
|
<input type="text" class="url-form option" name="option-a" placeholder="Option A" maxlength="64" data-required>
|
||||||
|
<input type="text" class="url-form option" name="option-b" placeholder="Option B" maxlength="64" data-required>
|
||||||
|
<button type="button" class="button symbol add-option">Add option</button>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if user.has_freedom %}
|
||||||
|
<input type="text" class="textarea-line url-form" name="url" placeholder="URL/YT video" maxlength="1024">
|
||||||
|
{% file_button %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="post-form-footer-options">
|
||||||
|
|
||||||
|
<div class="post-form-footer-option-inner post-form-spoiler js-post-form-spoiler test-post-form-spoiler">
|
||||||
|
<label class="spoiler-button symbol">
|
||||||
|
<input type="checkbox" id="is_spoiler" name="is_spoiler" value="1">
|
||||||
|
Spoilers
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button post-button disabled" value="Send" data-community-id="{{ community.unique_id }}" data-post-content-type="text" data-post-with-screenshot="nodata" disabled="">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not user.is_active %}
|
||||||
|
<p>Your account has been disabled.</p>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{% load closedverse_tags %}{% load closedverse_community %}<div class="list post-list js-post-list" data-next-page-url="{% if next %}?offset={{ next }}{% endif %}">
|
||||||
|
{% if posts %}
|
||||||
|
{% for post in posts %}
|
||||||
|
{% community_post post type %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% if nf %}{% nocontent nf %}{% else %}{% nocontent "The posts couldn't be loaded." %}{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{% load closedverse_community %}<ul class="list reply-list test-reply-list">
|
||||||
|
{% for comment in comments %}
|
||||||
|
{% post_comment comment %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
{% load closedverse_tags %}<div id="{{ post.unique_id }}" {% if post.spoils or not post.creator.is_active %}data-href-hidden{% else %}data-href{% endif %}="{% url "main:post-view" post.id %}" class="post trigger{% if post.screenshot %} with-image{% endif %}{% if post.spoils or not post.creator.is_active %} hidden test-hidden{% endif %}" tabindex="0">
|
||||||
|
|
||||||
|
<p class="community-container"><a {% if post.community.clickable %}href="{% url "main:community-view" post.community_id %}"{% endif %}><img src="{{ post.community.icon }}" class="community-icon">{{ post.community.name }}</a></p>
|
||||||
|
|
||||||
|
<div class="body">
|
||||||
|
<div class="post-content">
|
||||||
|
{% user_icon_container post.creator post.feeling %}
|
||||||
|
|
||||||
|
<p class="user-name"><a {% if post.creator.color %}style=color:{{ post.creator.color }}{% endif %} href="{% url "main:user-view" post.creator.username %}">{{ post.creator.nickname }}</a></p>
|
||||||
|
|
||||||
|
<p class="timestamp-container">
|
||||||
|
{% if post.spoils %}
|
||||||
|
<span class="spoiler">Spoilers</span>·
|
||||||
|
{% endif %}
|
||||||
|
{% if post.has_edit %}
|
||||||
|
<span class="spoiler">Edited ({% time post.edited %})</span>·
|
||||||
|
{% endif %}
|
||||||
|
<a class="timestamp" {% if post.spoils and not post.is_mine %}data-href-hidden{% else %}href{% endif %}="{% url "main:post-view" post.id %}">{% time post.created %}</a>
|
||||||
|
{% if post.drawing %}
|
||||||
|
<span class="spoiler">(handwritten)</span>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
{% if post.yt_vid %}
|
||||||
|
<a href="{% url "main:post-view" post.id %}" class="screenshot-container video"><img height="48" src="https://i.ytimg.com/vi/{{ post.yt_vid }}/default.jpg"></a>
|
||||||
|
{% endif %}
|
||||||
|
{% if post.screenshot %}
|
||||||
|
<a href="{% url "main:post-view" post.id %}" class="screenshot-container still-image"><img src="{{ post.screenshot }}"></a>
|
||||||
|
{% endif %}
|
||||||
|
{% if post.drawing %}
|
||||||
|
<p class="post-content-memo"><img src="{{ post.drawing }}" class="post-memo"></p>
|
||||||
|
{% else %}
|
||||||
|
{% if post.has_line_trun %}
|
||||||
|
<p class="post-content-text">{{ post.body|truncatechars:100 }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="post-content-text">{{ post.body|truncatechars:100|linebreaksbr }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if post.spoils and post.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>This post contains spoilers.
|
||||||
|
<button type="button" class="hidden-content-button">View Post</button>
|
||||||
|
</p></div>
|
||||||
|
{% endif %}
|
||||||
|
{% if not post.creator.is_active %}
|
||||||
|
<div class="hidden-content"><p>Content hidden because its creator was banned. </p>
|
||||||
|
{% if post.creator.get_warned_reason %}
|
||||||
|
<p>Reason: {{post.creator.get_warned_reason}}
|
||||||
|
{% endif %}
|
||||||
|
<button type="button" class="hidden-content-button">View Anyway</button>
|
||||||
|
</p></div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="post-meta">
|
||||||
|
<button type="button"{% if not post.can_yeah %} disabled{% endif %} class="symbol submit yeah-button
|
||||||
|
{% if post.has_yeah %}empathy-added{% endif %}
|
||||||
|
" data-feeling="" data-action="{% url "main:post-add-yeah" post.id %}" data-community-id="{{ post.community.unique_id }}" data-url-id="{{ post.id }}"><span class="yeah-button-text">{% empathy_txt post.feeling post.has_yeah %}</span></button>
|
||||||
|
{% if post.url %}
|
||||||
|
<a class="link-confirm symbol button" href="{{ post.url }}"></a>
|
||||||
|
{% endif %}
|
||||||
|
<div class="empathy symbol"><span class="symbol-label">Yeahs</span><span class="empathy-count">{{ post.number_yeahs }}</span></div>
|
||||||
|
<div class="reply symbol"><span class="symbol-label">Comments</span><span class="reply-count">{{ post.number_comments }}</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{% load closedverse_user %}<div class="list follow-list">
|
||||||
|
<ul class="list-content-with-icon-and-text arrow-list" id="friend-list-content" data-next-page-url="{% if next %}?offset={{ next }}{% endif %}">
|
||||||
|
{% for user in users %}
|
||||||
|
{% profile_user user request %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{% load closedverse_tags %}<li class="trigger" data-href="{% url "main:user-view" user.username %}">
|
||||||
|
{% user_icon_container user %}
|
||||||
|
|
||||||
|
{% if request.user.is_authenticated and not user.is_following %}
|
||||||
|
<div class="toggle-button">
|
||||||
|
<button type="button" data-action="{% url "main:user-follow" user.username %}" class="follow-button button symbol relationship-button">Follow</button>
|
||||||
|
<button type="button" class="button follow-done-button relationship-button symbol none" disabled="">Follow</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="body">
|
||||||
|
<p class="title">
|
||||||
|
<span class="nick-name"><a {% if user.color %}style=color:{{ user.color }}{% endif %} href="{% url "main:user-view" user.username %}">{{ user.nickname }}</a></span>
|
||||||
|
<span class="id-name">{{ user.username }}</span>
|
||||||
|
</p>
|
||||||
|
<p class="text">{{ user.profile.comment }}</p>
|
||||||
|
|
||||||
|
{% if user.profile.favorite.screenshot %}
|
||||||
|
<div class="user-profile-memo-content">
|
||||||
|
<img src="{{ user.profile.favorite.screenshot }}" class="user-profile-memo">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{% load closedverse_tags %}{% load closedverse_user %}<div class="list post-list js-post-list" data-next-page-url="{% if next %}?offset={{ next }}{% endif %}">
|
||||||
|
{% if posts %}
|
||||||
|
{% for post in posts %}
|
||||||
|
{% user_post post type %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% if nf %}{% nocontent nf %}{% else %}{% nocontent "The posts couldn't be loaded." %}{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<a href="{% url "main:user-view" user.username %}" class="icon-container {{ uclass }} {% if user.online_status == True %}online{% elif user.online_status == 2 %}afk{% elif user.online_status == False %}offline{% endif %}"><img src="{{ url }}" class="icon"></a>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{% load closedverse_tags %}<div class="news-list-content trigger{% if not notification.read %} notify{% endif %}" tabindex="0" id="{{ notification.unique_id }}" data-href="{{ notification.url }}">
|
||||||
|
{% user_icon_container notification.source %}
|
||||||
|
<div class="body">
|
||||||
|
{% if notification.type == 0 %}
|
||||||
|
{% print_names notification.all_users %} gave <a href="{{ notification.url }}" class="link">your post ({{ notification.context_post.trun|truncatechars:30 }})</a> a Yeah.
|
||||||
|
{% elif notification.type == 1 %}
|
||||||
|
{% print_names notification.all_users %} gave <a href="{{ notification.url }}" class="link">your comment ({{ notification.context_comment.trun|truncatechars:30 }})</a> a Yeah.
|
||||||
|
{% elif notification.type == 2 %}
|
||||||
|
{% print_names notification.all_users %} commented on <a href="{{ notification.url }}" class="link">your post ({{ notification.context_post.trun|truncatechars:30 }})</a>.
|
||||||
|
{% elif notification.type == 3 %}
|
||||||
|
{% print_names notification.all_users %} commented on <a href="{{ notification.url }}" class="link">{{ notification.source.nickname }}'s post ({{ notification.context_post.trun|truncatechars:30 }})</a>.
|
||||||
|
{% elif notification.type == 4 %}
|
||||||
|
Followed by {% print_names notification.all_users %}.
|
||||||
|
{% endif %}
|
||||||
|
<span class="timestamp"> {% time notification.latest %}</span>
|
||||||
|
{% if notification.type == 4 and not notification.source.is_following and not notification.all_users|length > 1 %}
|
||||||
|
<div class="toggle-button">
|
||||||
|
<button type="button" data-action="{% url "main:user-follow" notification.source.username %}" class="follow-button button symbol">Follow</button>
|
||||||
|
<button type="button" class="button follow-done-button relationship-button symbol none" disabled="">Follow</button>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<button class="symbol button rm" type="button"></button>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{% load closedverse_tags %}<div id="sidebar-profile-body"{% if profile.favorite %} class="with-profile-post-image"{% endif %}>
|
||||||
|
<div class="icon-container {% user_class user %} {% if user.online_status == True %}online{% elif user.online_status == 2 %}afk{% elif user.online_status == False %}offline{% endif %}">
|
||||||
|
<a href="{% url "main:user-view" user.username %}">
|
||||||
|
<img src="{% avatar user %}" alt="{{ user.nickname }}" class="icon">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% if user.get_class.1 %}<p class="user-organization">{% user_level user %}</p>{% endif %}
|
||||||
|
|
||||||
|
<a href="{% url "main:user-view" user.username %}" class="nick-name"{% if user.color %}style=color:{{ user.color }}{% endif %}>{{ user.nickname }}</a>
|
||||||
|
<p class="id-name">{{ user.username }}</p>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% if user.is_authenticated %}<div id="sidebar" class="{% if general %}general{% else %}user{% endif %}-sidebar">
|
||||||
|
|
||||||
|
{% if not user.is_active %}
|
||||||
|
<div class="notice" style="background-color: #ff9797;border: 1px solid #ff5252;">
|
||||||
|
<b>Notice</b>: This user account is disabled.
|
||||||
|
<div>
|
||||||
|
{% if user.get_warned_reason %}
|
||||||
|
<p>Reason: "{{ user.get_warned_reason }}"</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if user.is_warned and user.is_active %}
|
||||||
|
<div class="notice" style="background-color: #ffc783;border: 1px solid #ffb358;">
|
||||||
|
<p><b>Notice</b>: This user has received a warning by an administrator.</p>
|
||||||
|
<div>
|
||||||
|
{% if user.get_warned_reason %}
|
||||||
|
<p>Reason: "{{ user.get_warned_reason }}"</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="sidebar-container">
|
||||||
|
{% if profile.favorite.screenshot %}
|
||||||
|
<a href="{% url "main:post-view" profile.favorite_id %}" id="sidebar-cover" style="background-image:url({{ profile.favorite.screenshot }})">
|
||||||
|
<img src="{{ profile.favorite.screenshot }}" class="sidebar-cover-image">
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% user_sidebar_info user profile %}
|
||||||
|
{% if request.user.is_authenticated and not user.is_me %}
|
||||||
|
<div class="user-action-content">
|
||||||
|
<div class="toggle-button">
|
||||||
|
<button type="button" data-action="{% url "main:user-follow" user.username %}" class="follow-button button symbol{% if user.is_following %} none{% endif %}">Follow</button>
|
||||||
|
<button type="button" data-action="{% url "main:user-unfollow" user.username %}" class="unfollow-button button symbol{% if not user.is_following %} none{% endif %}" data-screen-name="{{ user.nickname }}">Follow</button>
|
||||||
|
{% if selection == 0 %}
|
||||||
|
{% if user.friend_state == 0 %}
|
||||||
|
{% if profile.can_friend %}
|
||||||
|
<button type="button" data-action="{% url "main:user-fr-create" user.username %}" class="friend-button create button symbol">Send friend request</button>
|
||||||
|
{% endif %}
|
||||||
|
{% elif user.friend_state == 1 %}
|
||||||
|
<button type="button" data-action="{% url "main:user-fr-cancel" user.username %}" data-screen-name="{{ user.nickname }}" class="friend-button unf cancel button symbol">Cancel friend request</button>
|
||||||
|
{% elif user.friend_state == 2 %}
|
||||||
|
<button type="button" data-action="{% url "main:user-fr-create" user.username %}" data-screen-name="{{ user.nickname }}" data-time="{% time fr.created True %}" data-msg="{{ fr.body }}" class="friend-button accept button symbol">Become friends</button>
|
||||||
|
{% elif user.friend_state == 3 %}
|
||||||
|
<button type="button" data-action="{% url "main:user-fr-delete" user.username %}" data-screen-name="{{ user.nickname }}" class="friend-button unf delete button symbol">Friends</button>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if request.user.can_manage %}
|
||||||
|
<button class="button" data-href="{% url "main:user-tools" user.username %}">User Settings</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% if fr %}{% fr_accept fr %}{% endif %}
|
||||||
|
{% if user.friend_state == 0 %}
|
||||||
|
<div class="dialog none" data-modal-types="post-friend-request">
|
||||||
|
<div class="dialog-inner">
|
||||||
|
<div class="window">
|
||||||
|
<h1 class="window-title">Send friend request to {{ user.nickname }}</h1>
|
||||||
|
<div class="window-body">
|
||||||
|
<p class="description">Friend Request: <img width="36px" height="36px" src="{% avatar user %}">{{ user.nickname }}</p>
|
||||||
|
<form method="post">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<textarea name="body" class="textarea" maxlength="2200" data-placeholder="Write a friend request here." placeholder="Write a friend request here."></textarea>
|
||||||
|
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="button" class="olv-modal-close-button gray-button" value="Cancel">
|
||||||
|
<input type="submit" value="Send" class="post-button black-button">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% elif user.is_me and not general %}
|
||||||
|
<div id="edit-profile-settings"><a class="button symbol" href="{% url "main:profile-settings" %}">Profile Settings</a></div>
|
||||||
|
{% endif %}{% if user.is_me %}
|
||||||
|
<button class="button" onclick="Olv.Closed.lights()">Toggle Dark Mode</button>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<ul id="sidebar-profile-status">
|
||||||
|
<li><a href="{% url "main:user-friends" user.username %}" class="{% if selection == 3 %}selected{% endif %}"><span><span class="number test-friend-count">{{ user.num_friends }}</span>Friends</span></a></li>
|
||||||
|
<li><a href="{% url "main:user-following" user.username %}" class="{% if selection == 4 %}selected{% endif %}"><span><span class="number test-following-count">{{ user.num_following }}</span>Following</span></a></li>
|
||||||
|
<li><a href="{% url "main:user-followers" user.username %}" class="{% if selection == 5 %}selected{% endif %}"><span><span class="number test-follower-count">{{ user.num_followers }}</span>Followers</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% if not general %}
|
||||||
|
<div class="sidebar-setting sidebar-container">
|
||||||
|
<div class="sidebar-post-menu">
|
||||||
|
<a href="{% url "main:user-posts" user.username %}" class="sidebar-menu-post with-count symbol{% if selection == 1 %} selected{% endif %}">
|
||||||
|
<span>{% if user.is_me %}My{% else %}All{% endif %} Posts</span>
|
||||||
|
<span class="post-count">
|
||||||
|
<span class="test-post-count">{{ user.num_posts }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
{% if profile.comments_visible %}
|
||||||
|
<a href="{% url "main:user-comments" user.username %}" class="sidebar-menu-replies with-count symbol{% if selection == 6 %} selected{% endif %}">
|
||||||
|
<span>{% if user.is_me %}My{% else %}All{% endif %} Comments</span>
|
||||||
|
<span class="post-count">
|
||||||
|
<span class="test-reply-count">{{ user.num_comments }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if profile.yeahs_visible and request.user.is_authenticated %}
|
||||||
|
<a href="{% url "main:user-yeahs" user.username %}" class="sidebar-menu-empathies with-count symbol{% if selection == 2 %} selected{% endif %}">
|
||||||
|
<span>Yeahs Given</span>
|
||||||
|
<span class="post-count">
|
||||||
|
<span class="test-empathy-count">{{ user.num_yeahs }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="sidebar-container sidebar-profile">
|
||||||
|
{% if profile.comment %}
|
||||||
|
<div class="profile-comment">
|
||||||
|
<p class="js-truncated-text">{{ profile.comment|truncatechars:300|linebreaksbr|urlize }}</p>
|
||||||
|
{% if profile.comment|length > 299 %}
|
||||||
|
<p class="js-full-text none">{{ profile.comment|linebreaksbr }}</p>
|
||||||
|
<button type="button" class="description-more-button js-open-truncated-text-button">Show More</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="user-data">
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Region</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{% if profile.country %}{{ profile.country }}{% else %}Not Set{% endif %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>NNID</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{% if profile.origin_id_public == 1 %}Private{% elif not profile.origin_id_public %}None{% else %}{{ profile.origin_id_public }}{% endif %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>User ID</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>#{{ user.id }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Date Joined</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{% time user.created True %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if not user.hide_online %}
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Last Seen</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{% time user.last_login True %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if profile.pronoun_is %}
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Preferred Pronoun</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{{ profile.get_pronoun_is_display }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if profile.gender_is %}
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Gender</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{{ profile.get_gender_is_display }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if profile.external %}
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>Discord Tag</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{{ profile.external }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if profile.whatareyou %}
|
||||||
|
<div class="data-content">
|
||||||
|
<h4><span>I am a</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{{ profile.whatareyou }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="favorite-game-genre">
|
||||||
|
<h4><span>Web URL</span></h4>
|
||||||
|
<div class="note">
|
||||||
|
<span>{% if profile.weblink %}<a class="link-confirm" href="{% if not profile.got_fullurl %}http://{% endif %}{{ profile.weblink }}">{{ profile.weblink }}</a>{% else %}Not Set{% endif %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if user.community_favorites %}
|
||||||
|
<div class="sidebar-container sidebar-favorite-community">
|
||||||
|
<h4><a href="{% url "main:community-favorites" %}{% if not user.is_me %}?u={{ user.username }}{% endif %}" class="symbol favorite-community-button"><span>Favorite communities</span></a></h4>
|
||||||
|
<ul class="test-favorite-communities">
|
||||||
|
{% for community in user.community_favorites %}
|
||||||
|
|
||||||
|
<li class="favorite-community">
|
||||||
|
<a href="{% url "main:community-view" community.id %}" class="icon-container">
|
||||||
|
<img src="{{ community.icon }}" class="icon">
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if availableads %}
|
||||||
|
<div class="adx">
|
||||||
|
<h3>User-Generated Ad</h3>
|
||||||
|
<p><a href="/help/whatads">What are user-generated ads?</a></p>
|
||||||
|
<a href="{{ ad.url }}"><img src="{{ ad.imageurl.url }}"></a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% block main-body %}
|
||||||
|
<div class="main-column center">
|
||||||
|
<div class="post-list-outline login-page">
|
||||||
|
<form method="post">
|
||||||
|
<img src="{% static "img/menu-logo.png" %}">
|
||||||
|
<p class="lh">{{ title }}</p>
|
||||||
|
<p>If you've forgotten your password or need to reset it for some reason, you've come to the right place.<br>Yes, this works.</p>
|
||||||
|
<h3 class="label"><label>E-mail address: <input type="email" class="auth-input" name="email" placeholder="Email" required></label></h3>
|
||||||
|
{% csrf_token %}
|
||||||
|
<p class="red" style="margin-bottom:6px"></p>
|
||||||
|
<button type="submit" class="button">Submit</button>
|
||||||
|
<div class="ll">
|
||||||
|
<p>Having issues? Want to get back into your account? Try <a href="{% url "main:help-contact" %}">contacting us</a> if you need help with this.</p>
|
||||||
|
<p>Notice: Your user ID is used to log in, and is sometimes referred to as a username. It is below your nickname in most cases, please make sure you are using your user ID and your password.</p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% block main-body %}
|
||||||
|
<div class="main-column center">
|
||||||
|
<div class="post-list-outline login-page">
|
||||||
|
<form method="post">
|
||||||
|
<img src="{% static "img/menu-logo.png" %}">
|
||||||
|
<p class="lh">Reset password</p>
|
||||||
|
<p>Hello {{ user.username }}, it's time to change your password.</p>
|
||||||
|
<form method="post">
|
||||||
|
<h3 class="label"><label>New password: <input type="password" class="auth-input" name="password" placeholder="Password" required></label></h3>
|
||||||
|
<h3 class="label"><label>Confirm new password: <input type="password" class="auth-input" name="password_again" placeholder="Password again" required></label></h3>
|
||||||
|
{% csrf_token %}
|
||||||
|
<p class="red" style="margin-bottom:6px"></p>
|
||||||
|
<button type="submit" class="button">Reset</button>
|
||||||
|
<div class="ll">
|
||||||
|
<p>Once finished you can log into your account with your new password.</p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
|
||||||
|
<h2 class="label">{{ title }}</h2>
|
||||||
|
|
||||||
|
<div id="notification-tab-container" class="tab-container">
|
||||||
|
<div class="tab2">
|
||||||
|
<a class="tab-icon-my-news{% if notifs %} notify{% endif %}" href="{% url "main:notifications" %}">
|
||||||
|
<span class="symbol nf"></span>
|
||||||
|
<span>Updates</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a class="tab-icon-my-news selected" href="{% url "main:friend-requests" %}">
|
||||||
|
<span class="symbol fr"></span>
|
||||||
|
<span>Friend Requests</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% for fr in friendrequests %}
|
||||||
|
{% fr_accept fr %}
|
||||||
|
{% endfor %}
|
||||||
|
<div class="list news-list">
|
||||||
|
{% if friendrequests %}
|
||||||
|
{% for fr in friendrequests %}
|
||||||
|
<div class="news-list-content trigger" tabindex="0" id="{{ fr.unique_id }}" data-href="{% url "main:user-view" fr.source.username %}">
|
||||||
|
{% user_icon_container fr.source %}
|
||||||
|
<div class="body">
|
||||||
|
<a href="{% url "main:user-view" fr.source.username %}" class="nick-name"{% if fr.source.color %}style=color:{{ fr.source.color }}{% endif %}>{{ fr.source.nickname }}</a><br><span class="timestamp"> {% time fr.created %}</span>
|
||||||
|
<button class="button received-request-button" type="button">View friend request</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% nocontent "No friend requests yet." %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<!--
|
||||||
|
{% if user.is_staff and user.is_authenticated %}
|
||||||
|
<div class="notice" style="border: 1px solid #75ff7b;background-color: #c0ffc2;">
|
||||||
|
<p><b>Notice</b>: You are a staff member, you have permission to view redacted URLs.
|
||||||
|
</p></div>
|
||||||
|
{% endif %}
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="notice">
|
||||||
|
<p><b>Notice</b>: Your IP and email are both viewable in MySQL. Use caution when using clones that are hosted by untrusted users.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Active clones</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>im too lazy to update this</p>
|
||||||
|
<!--
|
||||||
|
<h2>Juice</h2>
|
||||||
|
{% if not user.is_staff %}
|
||||||
|
<p>Clone online. - [URL REDACTED]</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if user.is_staff and user.is_authenticated %}
|
||||||
|
<p>Do not share this URL to the public. - [<a href="https://juice.isledelfino.net/">URL</a>]</p>
|
||||||
|
{% endif %}
|
||||||
|
<p>Juice is based off Project Ultima. It's been around for a while, considering how long most clones usually last.</p>
|
||||||
|
<h2>Leaper</h2>
|
||||||
|
{% if not user.is_staff %}
|
||||||
|
<p>Clone online. - [URL REDACTED]</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if user.is_staff and user.is_authenticated %}
|
||||||
|
<p>Do not share this URL to the public. - [<a href="https://caustica.isledelfino.net/">URL</a>]</p>
|
||||||
|
{% endif %}
|
||||||
|
<p>This clone has a few distinct features that separate it from the others. You have a wide selection of (slightly buggy) themes. You have background music for some pages. And you can edit your post too.</p>
|
||||||
|
<h2>"Miiverse" Clone</h2>
|
||||||
|
<p>Clone online. - [<a href="https://miiverse.lol">miiverse.lol</a>]</p>
|
||||||
|
<p>It's your standard Cedar rehost, it's skinned to fit a "Miiverse" aesthetic. For a while this clone remained a secret until some dude leaked the URL. Since the cat was out of the bag a long time ago, I might as well show it here.</p>
|
||||||
|
<h2>Bradenverse xddddd</h2>
|
||||||
|
<p>this clone will last a week, so I don't care.</p>
|
||||||
|
<p>It comes up, dies and comes back online</p>
|
||||||
|
<p>i forgor 💀 the url</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h2 class="label">Active public clones</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<h2>Cedar</h2>
|
||||||
|
<p>You're using this one right now!</p>
|
||||||
|
<p>This site is not super expensive, and I'm able to reasonably maintain this site. Now this is not happening anytime soon, but eventually Cedar will be shut down. Users will be informed of the upcoming shutdown in advance when that time comes. All user data like profiles, posts, comments, and conversations will all be deleted and not archived by me.</p>
|
||||||
|
<h2>Exverse</h2>
|
||||||
|
<p>Clone online, but who fucking cares? - [<a href="https://exverse.ml/">https://exverse.ml/</a>]</p>
|
||||||
|
<p>Also, I can't sign up to it for whatever reason, don't ask why I want to, but yeah it's a bit broken I guess.</p>
|
||||||
|
<p>Edit: so I did sign up for that site, it's busted as fuck, the CSS looks HORRIBLE oh god what the fuck</p>
|
||||||
|
<p>The entire site is ugly as fuck, I don't know what the dude messing with the CSS was smoking.</p>
|
||||||
|
<h2>Rverse</h2>
|
||||||
|
<p>Clone online. - [3DS ONLY]</p>
|
||||||
|
<p>Does this even count?</p>
|
||||||
|
<p>Well, it's the most active clone out there, the only problem is that it's only accessible through a hacked 3DS system with Rverse installed. For some, this may be a dealbreaker.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h2 class="label">Other clones</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>Goofy ahh clones</p>
|
||||||
|
<h2 style="background-color: #000000;">Geoverse</h2>
|
||||||
|
<p>This service has ended. - [<a href="http://geoverse.usecedar.ca/">http://geoverse.usecedar.ca/</a>]</p>
|
||||||
|
<h3>What the hell happened to it?</h3>
|
||||||
|
<p>I have a lot of stuff to explain here. Let's just go in chronological order.</p>
|
||||||
|
<ul>
|
||||||
|
<li>I hosted this clone for Ghosty Tongue.</li>
|
||||||
|
<li>A while passes by with zero activity.</li>
|
||||||
|
<li>I announce its shutdown date on the site itself.</li>
|
||||||
|
<li>Ghosty decides to give out the SSH password to a few people.</li>
|
||||||
|
<li>Ghosty claims he had permission from me to do this, but he lied.</li>
|
||||||
|
<li>Ghosty posts the SSH login on the announcements channel for the Clonepedia Discord server.</li>
|
||||||
|
<li>So basically the database is now fully accessible, emails, and IPs are free real estate.</li>
|
||||||
|
<li>The discord goes fucking berserk.</li>
|
||||||
|
<li>HTML elements are being edited.</li>
|
||||||
|
<li>I wake up to 1000 pings on people warning me about the compromised server.</li>
|
||||||
|
<li>I look at the hellhole that's Geoverse.</li>
|
||||||
|
<li>I shut it down.</li>
|
||||||
|
<li>I revive it shorty after with a new SSH password.</li>
|
||||||
|
<li>I turn that shit into fucking Minionsverse.</li>
|
||||||
|
<li>I shut it down forever this time.</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Banama</h2>
|
||||||
|
<p>Clone online. - [<a href="https://banama.club">https://banama.club</a>]</p>
|
||||||
|
<p>Now, none of us are getting in, but let's think of this website as a place to accommodate a friend group more than a regular clone. It's nothing all that spectacular.</p>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Contact the team behind this</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>I'll make this page later, need permission from our admins and shit...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<title>Hi</title>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<style>html{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto, Helvetica, Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";}</style>
|
||||||
|
</head>
|
||||||
|
<body style="text-align:center">
|
||||||
|
<img alt="The logo" src="{{ menulogo }}">
|
||||||
|
<br>
|
||||||
|
<p><i>A password reset request has been submitted for your email.</i></p>
|
||||||
|
<p>Follow this link to reset your password: <a href="{{ link }}">{{ link }}</a></p>
|
||||||
|
<p>If you didn't submit this, please ignore this email, someone probably tried to use your email to reset, and they can't have any access unless they actually have your email address. If you're having trouble, <a href="{{ contact }}">contact us here</a>.</p><br>
|
||||||
|
<p>Thank you for using our service! :)</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Frequently Asked Questions (FAQ)</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>Hey there! If you have any questions about Cedar, this page aims to answer them.</p>
|
||||||
|
<h2>What is Cedar?</h2>
|
||||||
|
<p>Cedar is a social network that offers a safe and secure platform for users to connect and share. It is based on the Closedverse project and has some unique features compared to other sites, such as customizable communities and a drawing tool.</p>
|
||||||
|
<h3>The history of cedar</h3>
|
||||||
|
<p>The domain "cedar.doctor" was originally owned by a guy named Seth, who used it to host his own social network. However, Seth stopped hosting the site and the domain expired. I decided to purchase this domain and use it to host this website.</p>
|
||||||
|
<h2>What is Closedverse?</h2>
|
||||||
|
<p>Closedverse was a social network project that was developed by PF2M and Arian Kordi. It was inspired by Miiverse, a social networking service that was offered by Nintendo for its gaming consoles. Closedverse was originally intended to be a safe and friendly community for users to connect and share, but it unfortunately had to shut down on April 4, 2019.</p>
|
||||||
|
<h2>The legacy of Miiverse clones</h2>
|
||||||
|
<p>Miiverse clones, such as Closedverse and Cedar, have a complicated history. Many of these projects have faced challenges and faced criticism for their moderation and management. Closedverse, for example, was known for its drama and conflict, which ultimately led to its shut down.</p>
|
||||||
|
<p>Despite these challenges, Cedar aims to provide a safe and friendly space for users to connect and share. We are committed to maintaining a positive and respectful community, and we have put in place measures to ensure that our moderation is effective and fair. If you have any concerns or questions, please don't hesitate to contact us.</p>
|
||||||
|
<h2>What data do we collect?</h2>
|
||||||
|
<p>For security reasons, we collect and store certain data about our users, such as their IP address, nickname, and comment history. This information is used to protect the site and its users from any potential harm.</p>
|
||||||
|
<p>In addition, any data that users choose to include in their profiles is stored in our database. Users can remove this data at any time, unless they are banned from the site.</p>
|
||||||
|
{% if request.user.is_authenticated %}
|
||||||
|
<div class="center center-input">
|
||||||
|
<button class="button" data-href="{% url "main:my-data" %}">View your data</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<h2>What can I do on Cedar?</h2>
|
||||||
|
<p>Cedar offers a variety of features that allow users to connect and share with others. These include the ability to change the color and background of the website, create and customize communities, and rate user content using "Yeahs" instead of likes.</p>
|
||||||
|
<h2>Is this allowed?</h2>
|
||||||
|
<p>Cedar is a fork of Closedverse, which was originally created by PF2M and Arian Kordi. It is not affiliated with Nintendo or Hatena in any way, and these companies have no involvement with our service.</p>
|
||||||
|
<h2>Any funny details?</h2>
|
||||||
|
<p>Cedar is built using the Django web application framework, which makes it easy to add and modify features. It is a personal project that is not intended to generate revenue or profit. Instead, it is meant to be a fun and safe space for users to connect and share.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}--
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Our new approval system</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>Placeholder</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Legal info</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<!-- Bootstrap for this, why not? -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<center>
|
||||||
|
<h2>Closedverse - legal info</h2>
|
||||||
|
<h3>Copyright information</h3>
|
||||||
|
</center>
|
||||||
|
<pre style="white-space:pre-wrap;">
|
||||||
|
This project is not, in any way, associated with Nintendo Co, Ltd. or Hatena Co, Ltd.
|
||||||
|
Nintendo and Hatena have no involvement with this service, neither company maintains, endorses, sponsors or contributes to this. This is solely maintained, paid for, and created by Arian Kordi et al.
|
||||||
|
Please do not C&D me, let me know beforehand and I will attempt to solve an issue if there is one.
|
||||||
|
|
||||||
|
If anything here infringes on your rights, please contact me:
|
||||||
|
<a href="mailto:[email protected]">[email protected]</a>
|
||||||
|
or
|
||||||
|
<a href="mailto:[email protected]">[email protected]</a>
|
||||||
|
|
||||||
|
The specified content that does not belong to Arian Kordi, the owner, is:
|
||||||
|
* The spinner "spinner-wandering-cubes" seen in Activity Feed loading, scrolling (Autopagerize), and admin management loading, which is owned and designed entirely by <em>Hammer & Chisel (Discord)</em>
|
||||||
|
* The majority of the JavaScript, CSS and HTML files and the style of <em>Miiverse</em> is owned entirely by <em>Hatena Co, Ltd.</em> and <em>Nintendo Co, Ltd.</em>
|
||||||
|
* The loading animation, originally taken from <em><a href="https://splatoon.nintendo.net/">SplatNet</a></em> and <em>Splatoon</em> by <em>Nintendo Co, Ltd.</em> and modified
|
||||||
|
|
||||||
|
I will take this project and <a href="https://github.com/ariankordi/closedverse">its GitHub repository</a> down under any valid request.
|
||||||
|
Thank you!
|
||||||
|
|
||||||
|
<em>Revision 4, updated October 21 2017</em></pre>
|
||||||
|
|
||||||
|
<center>
|
||||||
|
<h3>User content policy</h3>
|
||||||
|
</center>
|
||||||
|
<pre style="white-space:pre-wrap;">
|
||||||
|
User content is not owned by me or the site. Any users' content (posts, empathies or Yeah!s, follows, friend requests, friendships, private messages, etc..) <strong>is their sole responsibility.</strong>
|
||||||
|
I am not and do not want to be deemed responsible if any user transmits content that can spawn a legal problem.
|
||||||
|
I am only a host for the content and so is the image hosting provider(s) if applicable.
|
||||||
|
|
||||||
|
If you have a problem that requires attention by <strong>me</strong>, please contact me:
|
||||||
|
<a href="mailto:[email protected]">[email protected]</a>
|
||||||
|
or
|
||||||
|
<a href="mailto:[email protected]">[email protected]</a>
|
||||||
|
|
||||||
|
If you feel you have the need to contact law enforcement for any case, please do so. Don't contact me if you have a major legal problem. I will not forward anything to your police department because I don't have the time and I don't know where you live.
|
||||||
|
|
||||||
|
Every user must be 13 years of age or older in order to use the site. We do not follow (and personally heavily deplore) any child protection acts, such as COPPA. Any user under 12 years of age is not permitted to use this site.
|
||||||
|
|
||||||
|
Thank you!
|
||||||
|
|
||||||
|
<em>Revision 3, updated October 6 2017</em></pre>
|
||||||
|
<button type="button" class="btn btn-primary" onclick="window.history.back();">Go back</button>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Login help</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>You have issues logging in into your account? Follow this to (maybe) solve this issue...</p>
|
||||||
|
<h2>It says that my user doesn't exist, but it does.</h2>
|
||||||
|
<p>Have you turned on email only login? It can only be on if you have an email address, so if you don't have one, it isn't on.<br>If it is on, please try logging in with your email address. Thank you.</p>
|
||||||
|
|
||||||
|
<h2>I forgot my password and I don't have an email address.</h2>
|
||||||
|
<p>In this case, the only solution is to contact an admin and they will most probably give you a password reset link.</p>
|
||||||
|
|
||||||
|
<h2>I'm getting "Your password must be reset"?</h2>
|
||||||
|
<p>This means that your password must be reset. Reset it via email, or ask an admin to reset it. In most cases, an admin has emailed you a password reset link.</p>
|
||||||
|
|
||||||
|
<h2>I'm being hacked! HELP!!!</h2>
|
||||||
|
<p>If others are in your account, no worry, when you change your password, everyone gets logged out.<br>
|
||||||
|
Unless your email was changed or you don't have one, in that case, contact an admin and they will help you ASAP.
|
||||||
|
<br><br>You should use a random password and keep it in your notes or something. In most cases, public user accounts are made due to one character passwords. Please do not use one character passwords.
|
||||||
|
<br>If you don't think your password is secure, but your e-mail address is secure, you can choose to have your account only be logged into via your email address, so that nobody can go into your account with your <i>public username</i> and try it.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div id="help" class="main-column">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">My data</h2>
|
||||||
|
<div class="help-content">
|
||||||
|
<p>Like any other site, we collect small bits of information from you for security reasons.
|
||||||
|
<h3>General account information:</h3>
|
||||||
|
<p>IP address: <span>{% if user.addr %}{{ user.addr }}{% else %}Data missing{% endif %}
|
||||||
|
<p>Signup IP address: <span>{% if user.signup_addr %}{{ user.signup_addr }}{% else %}Data missing{% endif %}</p>
|
||||||
|
<p>User agent: <span>{% if user.user_agent %}{{ user.user_agent }}{% else %}Data missing{% endif %}
|
||||||
|
<p>Rank: <span>{% if user.staff %}You are a staff member.{% elif not user.level <= 0 %}You are a moderator. (Level {{ user.level }}){% else %}You are a regular user.{% endif %}
|
||||||
|
<h3>My content:</h3>
|
||||||
|
<p>Your account has existed for {{ age }} days! During that time, we've collected:</p>
|
||||||
|
<ul>
|
||||||
|
<li>My posts: <span> {{ posts }}
|
||||||
|
<li>My comments: <span> {{ comments }}
|
||||||
|
<li>My messages: <span> {{ messages }}
|
||||||
|
<li>My yeahs: <span> {{ yeahs }}
|
||||||
|
<li>My notifications: <span> {{ notifications }}
|
||||||
|
</ul>
|
||||||
|
<h3>Restrictions:</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Sending images and creating new accounts: <span> {% if user.has_freedom %}Good standing{% else %}Restricted{% endif %}
|
||||||
|
<li>Post limit: <span> {% if request.user.profile.limit_post == 0 %}Good standing{% else %}{{ user.profile.limit_post }}{% endif %}
|
||||||
|
<li>Editing your profile: <span> {% if not user.profile.cannot_edit %}Good standing{% else %}Restricted{% endif %}
|
||||||
|
</ul>
|
||||||
|
<h3>Collected data:</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<p class="label">Account login history:</p>
|
||||||
|
<p>Each time you try and sign in to your account, we grab the <strong>IP</strong> and <strong>User agent</strong> from the device used. If you see any login attempts that you don't recognize as your own, you may want to change your password.</p>
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Success</th>
|
||||||
|
<th class="ip">IP</th>
|
||||||
|
<th>User agent</th>
|
||||||
|
</tr>
|
||||||
|
{% for log_attempt in log_attempt %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ log_attempt.created }}</td>
|
||||||
|
<td{% if not log_attempt.success %} style="border: #f44336 2px solid;"{% endif %}>{{ log_attempt.success }}</td>
|
||||||
|
<td class="ip">{% if log_attempt.success %}{{ log_attempt.addr }}{% else %}REDACTED{% endif %}</td>
|
||||||
|
<td>{{ log_attempt.user_agent }}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% if history %}
|
||||||
|
<p class="label">Nickname and Comment history:</p>
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time changed</th>
|
||||||
|
<th>New Nickname</th>
|
||||||
|
<th>New Comment</th>
|
||||||
|
</tr>
|
||||||
|
{% for history in history %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ history.created }}</td>
|
||||||
|
<td>{{ history.new_nickname }}</td>
|
||||||
|
<td>{% if not history.new_comment %}N/A{% else %}{{ history.new_comment|truncatechars:300 }}{% endif %}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% else %}
|
||||||
|
<p class="label">No name or comment changes to show.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<h3>I want this data removed.</h3>
|
||||||
|
<p>Please contact a staff member, if you wish, your account will be deleted along with all your data attached to it.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div id="help" class="main-column">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Cedar Rules</h2>
|
||||||
|
<div class="help-content">
|
||||||
|
<p>To keep the site healthy and enjoyable for all users, we have a few rules in place. Please read them carefully:</p>
|
||||||
|
<h3>User age requirement</h3>
|
||||||
|
<p>In accordance with the Children's Online Privacy Protection Act (COPPA), users under the age of 13 are not allowed to join the site. If we discover that a user is under 13, their account will be banned.</p>
|
||||||
|
<h3>No illegal content</h3>
|
||||||
|
<p>Please do not post any content that violates the law. This includes illegal activities, stolen intellectual property, and any other unlawful material.</p>
|
||||||
|
<h3>No NSFW or NSFL content</h3>
|
||||||
|
<p>We do not allow Not Safe For Work (NSFW) content, such as pornography, or Not Safe For Life (NSFL) content, such as graphic violence or gore. Please do not post or share this type of material on the site.</p>
|
||||||
|
<h3>Community standards</h3>
|
||||||
|
<p>To create a positive and respectful community, we ask that users avoid the following behaviors:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Doxing (sharing personal information without consent)</li>
|
||||||
|
<li>Threatening or promoting harm to oneself or others</li>
|
||||||
|
<li>Using hate speech or discriminatory language</li>
|
||||||
|
<!--<li>Spamming or posting excessive amounts of irrelevant content</li>-->
|
||||||
|
<li>Harassing or bullying other users</li>
|
||||||
|
<li>Posting extremely offensive or edgy content</li>
|
||||||
|
<li>Asking for moderator or staff privileges</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Community creation</h3>
|
||||||
|
<p>We want users to be able to create and participate in vibrant communities on the site. However, we ask that users do not:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Create communities that promote NSFW or NSFL content</li>
|
||||||
|
<li>Use icons, banners, descriptions, or titles that feature edgy, violent, or sexual content</li>
|
||||||
|
<li>Create duplicate communities that already exist on the site</li>
|
||||||
|
<li>Create communities using alternate accounts</li>
|
||||||
|
</ul>
|
||||||
|
<p>Please note that each user is only allowed to create one community. If your community is removed, you will not be able to create another one.</p>
|
||||||
|
<h3>Consequences for rule violations</h3>
|
||||||
|
<p>If a user violates any of the rules on the site, they will receive a warning from the moderators or site administrators. In most cases, a single warning will suffice. However, if the user continues to break the rules or engages in severe misconduct, they may be banned from the site.</p>
|
||||||
|
<p>Please note that exceptions may apply for more severe cases, such as illegal activities or threats of harm. In these situations, the user may be banned without warning.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Cedar stats</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<p>These are the current stats of this Cedar instance:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Communities: <strong>{{ communities }}</strong></li>
|
||||||
|
<li>Posts: <strong>{{ posts }}</strong></li>
|
||||||
|
<li>Users: <strong>{{ users }}</strong></li>
|
||||||
|
<li>Comments: <strong>{{ comments }}</strong></li>
|
||||||
|
<li>Messages: <strong>{{ messages }}</strong></li>
|
||||||
|
<li>Yeahs: <strong>{{ yeahs }}</strong></li>
|
||||||
|
<li>Complaints: <strong>{{ complaints }}</strong></li>
|
||||||
|
<li>Notifications: <strong>{{ notifications }}</strong></li>
|
||||||
|
<li>Follows: <strong>{{ follows }}</strong></li>
|
||||||
|
<li>Friendships: <strong>{{ friendships }}</strong></li>
|
||||||
|
</ul>
|
||||||
|
<button class="button reload-btn">Refresh</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">What are user-generated ads?</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<h2>What is that???</h2>
|
||||||
|
<p>Well, user-generated ads are a way for you to, without any money, promote your clone/website/service.</p>
|
||||||
|
<h2>Where these ads shows up?</h2>
|
||||||
|
<p>These ads shows up in activity, user pages, homepage, and more.</p>
|
||||||
|
<h2>How can I have my user-generated ad?</h2>
|
||||||
|
<p>Contact an admin.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column" id="help">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">Why?</h2>
|
||||||
|
<div id="guide" class="help-content">
|
||||||
|
<div class="faq">
|
||||||
|
<h2>Why should I join ?</h2>
|
||||||
|
<ul>
|
||||||
|
<li>I don't know...</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
{% load static %}{% load closedverse_tags %}{% block html %}{% if not request.META.HTTP_X_PJAX %}
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
{% endif %}
|
||||||
|
<title>{% if title %}{{ title }} - Cedar{% else %}Cedar{% endif %}</title>
|
||||||
|
{% if not request.META.HTTP_X_PJAX %}
|
||||||
|
<meta http-equiv="content-style-type" content="text/css">
|
||||||
|
<meta http-equiv="content-script-type" content="text/javascript">
|
||||||
|
<meta name="format-detection" content="telephone=no">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta name="apple-mobile-web-app-title" content="Cedar">
|
||||||
|
<meta name="description" content="It's Closedverse but Cedar!">
|
||||||
|
<meta property="og:locale" content="en_US">
|
||||||
|
{% if ogdata %}
|
||||||
|
<meta property="og:title" content="{{ ogdata.title }}">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="{{ request.build_absolute_uri }}">
|
||||||
|
<meta property="og:image" content="{{ ogdata.image }}">
|
||||||
|
<meta property="og:description" content="{{ ogdata.description|truncatechars:150 }}">
|
||||||
|
<meta property="og:site_name" content="Cedar">
|
||||||
|
<meta property="article:published_time" content="{{ ogdata.date }}">
|
||||||
|
{% endif %}
|
||||||
|
<link rel="shortcut icon" type="image/png" href="{% static "img/favicon.png" %}">
|
||||||
|
<link rel="stylesheet" type="text/css" href="{% static "closedverse.css" %}">
|
||||||
|
<link id="darkness" {% if request.session.lights %}disabled {% endif %}rel="stylesheet" type="text/css" href="{% static "blueness.css" %}">
|
||||||
|
<script src="{% static "jslibs.js" %}"></script>
|
||||||
|
<script src="{% static "closedverse.js" %}"></script>
|
||||||
|
{% if request.user.ColorTheme %}<script>
|
||||||
|
var mainColor = "{{ request.user.ColorTheme }}";
|
||||||
|
var darkColor;
|
||||||
|
var slightlyDarkColor;
|
||||||
|
var darkerColor;
|
||||||
|
var lightColor;
|
||||||
|
|
||||||
|
function changeThemeColor() {
|
||||||
|
// Convert hex to RGB
|
||||||
|
var rgb = hexToRgb(mainColor);
|
||||||
|
var mainColorR = rgb[0];
|
||||||
|
var mainColorG = rgb[1];
|
||||||
|
var mainColorB = rgb[2];
|
||||||
|
|
||||||
|
// Calculate light color
|
||||||
|
var lightColorR = mainColorR > 85 ? mainColorR * 2 : mainColorR + 175;
|
||||||
|
lightColorR = lightColorR > 255 ? 255 : lightColorR;
|
||||||
|
var lightColorG = mainColorG > 85 ? mainColorG * 2 : mainColorG + 175;
|
||||||
|
lightColorG = lightColorG > 255 ? 255 : lightColorG;
|
||||||
|
var lightColorB = mainColorB > 85 ? mainColorB * 2 : mainColorB + 175;
|
||||||
|
lightColorB = lightColorB > 255 ? 255 : lightColorB;
|
||||||
|
|
||||||
|
// Calculate dark colors
|
||||||
|
darkColor = rgb2hex(mainColorR / 4, mainColorG / 4, mainColorB / 4);
|
||||||
|
lightColor = rgb2hex(lightColorR, lightColorG, lightColorB);
|
||||||
|
slightlyDarkColor = rgb2hex(mainColorR / 1.4, mainColorG / 1.4, mainColorB / 1.4);
|
||||||
|
darkerColor = rgb2hex(mainColorR / 8, mainColorG / 8, mainColorB / 8);
|
||||||
|
|
||||||
|
// Set CSS variables
|
||||||
|
document.documentElement.style.setProperty("--theme", `rgb(${mainColorR}, ${mainColorG}, ${mainColorB})`);
|
||||||
|
document.documentElement.style.setProperty("--theme-dark", darkColor);
|
||||||
|
document.documentElement.style.setProperty("--theme-slightly-dark", slightlyDarkColor);
|
||||||
|
document.documentElement.style.setProperty("--theme-darker", darkerColor);
|
||||||
|
document.documentElement.style.setProperty("--theme-light", lightColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// hex -> rgb
|
||||||
|
function hexToRgb(hex) {
|
||||||
|
var bigint = parseInt(hex, 16);
|
||||||
|
var mainColorR = (bigint >> 16) & 255;
|
||||||
|
var mainColorG = (bigint >> 8) & 255;
|
||||||
|
var mainColorB = bigint & 255;
|
||||||
|
return [mainColorR, mainColorG, mainColorB];
|
||||||
|
}
|
||||||
|
|
||||||
|
// rgb -> hex
|
||||||
|
function rgb2hex(red, green, blue) {
|
||||||
|
var rgb = blue | (green << 8) | (red << 16);
|
||||||
|
return "#" + (0x1000000 + rgb).toString(16).slice(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
function toDefault() {
|
||||||
|
document.documentElement.style.setProperty("--theme", "initial");
|
||||||
|
document.documentElement.style.setProperty("--theme-dark", "initial");
|
||||||
|
document.documentElement.style.setProperty("--theme-slightly-dark", "initial");
|
||||||
|
document.documentElement.style.setProperty("--theme-darker", "initial");
|
||||||
|
document.documentElement.style.setProperty("--theme-light", "initial");
|
||||||
|
}
|
||||||
|
|
||||||
|
changeThemeColor();
|
||||||
|
</script>{% endif %}
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
{% if request.user.bg_url %}--background: url({{ request.user.bg_url }});{% endif %}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class=""{% if request.user.is_authenticated %}
|
||||||
|
sess-usern="{{ request.user.username }}"
|
||||||
|
{% endif %}>
|
||||||
|
<div id="wrapper"{% if not request.user.is_authenticated %} class="guest"{% endif %}>
|
||||||
|
<div id="sub-body">
|
||||||
|
<menu id="global-menu">
|
||||||
|
<li id="global-menu-logo"><h1><a href="/"><img src="{% static "img/menu-logo.png" %}" alt="Cedar"></a></h1></li>
|
||||||
|
{% if request.user.unique_id %}
|
||||||
|
<li id="global-menu-list">
|
||||||
|
<ul>
|
||||||
|
<li id="global-menu-mymenu"><a href="{% url "main:user-view" request.user.username %}"><span class="icon-container {% user_class request.user %}"><img src="{% avatar request.user %}" alt="My Profile"></span><span>My Profile</span></a></li>
|
||||||
|
<li id="global-menu-feed"><a href="{% url "main:activity" %}" class="symbol"><span>Activity Feed</span></a></li>
|
||||||
|
<li id="global-menu-community"><a href="/" class="symbol"><span>Communities</span></a></li>
|
||||||
|
<li id="global-menu-message"><a href="{% url "main:messages" %}" class="symbol"><span>Messages</span></a></li>
|
||||||
|
<li id="global-menu-news"><a href="{% url "main:notifications" %}" class="symbol"></a></li>
|
||||||
|
<li id="global-menu-my-menu"><button class="symbol js-open-global-my-menu open-global-my-menu"></button>
|
||||||
|
<menu id="global-my-menu" class="invisible none">
|
||||||
|
<li><a href="{% url "main:profile-settings" %}" class="symbol my-menu-profile-setting"><span>Profile settings</span></a></li>
|
||||||
|
<li><a href="#" class="symbol my-menu-account-setting"><span>Account preferences</span></a></li>
|
||||||
|
<li><a href="{% url "main:special-community-tag" "announcements" %}" class="symbol my-menu-openman"><span>Cedar Announcements</span></a></li>
|
||||||
|
<li><a href="{% url "main:help-faq" %}" class="symbol my-menu-guide"><span>Frequently Asked Questions (FAQ)</span></a></li>
|
||||||
|
<li><a href="{% url "main:help-rules" %}" class="symbol my-menu-guide"><span>Cedar Rules</span></a></li>
|
||||||
|
<li><a href="#" class="symbol my-menu-white-power"><span>Feedback/bug report</span></a></li>
|
||||||
|
<li><a href="{% url "main:server-stat" %}" class="symbol my-menu-openman"><span>Server Statistics</span></a></li>
|
||||||
|
<li>
|
||||||
|
<form action="{% url "main:logout" %}" method="post" id="my-menu-logout" class="symbol">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="submit" value="Log out">
|
||||||
|
</form>
|
||||||
|
</li>
|
||||||
|
</menu>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li id="global-menu-login">
|
||||||
|
<a href="{% url "main:login" %}" class="login">
|
||||||
|
<input type="image" alt="Sign in" src="{% static "img/sign-in.png" %}">
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</menu>
|
||||||
|
</div>
|
||||||
|
<div id="container">
|
||||||
|
{% endif %}
|
||||||
|
<div id="main-body"
|
||||||
|
class="{% if classes %}{{ classes|join:" " }} {% endif %}{% if not request.user.is_authenticated %}
|
||||||
|
guest{% endif %}"
|
||||||
|
csrf-token="{{ csrf_token }}">
|
||||||
|
{% block main-body %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
{% if not request.META.HTTP_X_PJAX %}
|
||||||
|
</div>
|
||||||
|
<!--
|
||||||
|
<div id="footer">
|
||||||
|
<div id="footer-inner">
|
||||||
|
<div class="link-container">
|
||||||
|
<p><a href="/help/contact">Contact</a> <a href="/help/rules">Rules</a></p>
|
||||||
|
<p id="copyright">Cedar Team, 2022</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{% endif %}{% endblock html %}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% block main-body %}
|
||||||
|
<div class="main-column center">
|
||||||
|
<div class="post-list-outline login-page">
|
||||||
|
<form method="post">
|
||||||
|
<img src="{% static "img/menu-logo.png" %}">
|
||||||
|
<h1 class="lh">Sign In</h1>
|
||||||
|
<h2 class="lh">Please sign in to access Cedar.</h2>
|
||||||
|
<div class="login-box">
|
||||||
|
<h3 class="label"><input type="text" class="auth-input" name="username" maxlength="32" placeholder="Username"></h3>
|
||||||
|
<h3 class="label"><input type="password" class="auth-input" name="password" maxlength="32" placeholder="Password"></h3>
|
||||||
|
</div>
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
<p class="red" style="margin-bottom:6px"></p>
|
||||||
|
|
||||||
|
<button type="submit" class="black-button">Sign In</button>
|
||||||
|
|
||||||
|
{% if allow_signups %}
|
||||||
|
<div class="ll">
|
||||||
|
<p>Can't remember your password? <a href="{% url "main:forgot-passwd" %}"> Reset it here!</a></a></p>
|
||||||
|
<p>If you don't have an account, you're in luck! <a href="{% url "main:signup" %}"> You can create an account there.</a></a></p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if not allow_signups %}
|
||||||
|
<div class="ll">
|
||||||
|
<p>Signing up is disabled for now, check by later.</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_tags %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">Change settings for {{ user.username }}</h2>
|
||||||
|
<form class="setting-form" method="post" action={% url "main:user-tools-set" user.username %}>
|
||||||
|
<li class="setting">
|
||||||
|
{% user_sidebar_info user %}
|
||||||
|
<p class="settings-label">Set Username:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="username" maxlength="32" placeholder="New Username" value="{{ user.username }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Change the account username here.<br />If you need to change this, make sure the user is aware of the change, otherwise they won't be able to log in.</p>
|
||||||
|
</li>
|
||||||
|
</li>
|
||||||
|
<li class="setting-profile-comment">
|
||||||
|
<p class="settings-label">Profile comment:</p>
|
||||||
|
<textarea class="textarea" name="profile_comment" maxlength="2200" placeholder="Profile comment">{{ profile.comment }}</textarea>
|
||||||
|
<p class="note">In case you need to change something in this person's profile comment, you can do so here.</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting">
|
||||||
|
<p class="settings-label">Set Nickname:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="nickname" maxlength="32" placeholder="New Username" value="{{ user.nickname }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Change the account nickname here</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting">
|
||||||
|
<p class="settings-label">Specify warning or ban reason:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="warned_reason" maxlength="400" placeholder="Reason" value="{% if user.warned_reason %}{{ user.warned_reason }}{% endif %}">
|
||||||
|
</div>
|
||||||
|
<p class="note">If you are going to warn or disable someone, PLEASE SPECIFY WHY HERE!<br />Nothing feels worse than to get banned or warned without knowing why.</p>
|
||||||
|
<input type="checkbox" name="warned" {% if user.warned %}checked{% endif %}>Show warning
|
||||||
|
</li>
|
||||||
|
<li class="setting">
|
||||||
|
<p class="settings-label">Account restrictions:</p>
|
||||||
|
<input type="checkbox" name="active" {% if not user.active %}checked{% endif %}>Disable account:
|
||||||
|
<p class="note">Check this setting to disable the account and prevent new accounts from being made. This is basically the main way to ban people. Remember to specify a reason for doing this.</p>
|
||||||
|
<p> </p>
|
||||||
|
<input type="checkbox" name="cannot_edit" {% if profile.cannot_edit %}checked{% endif %}>Lock user settings:
|
||||||
|
<p class="note">If you need to lock someone's profile settings, you can do that here!</p>
|
||||||
|
<input type="number" name="post_limit" min="0" max="999" value="{{ profile.limit_post }}"> Post limit:
|
||||||
|
<p class="note">If you need to set a post limit for someone, you can do that here, Set this back to "0" to remove the restriction.</p>
|
||||||
|
<input type="checkbox" name="let_freedom" {% if not profile.let_freedom %}checked{% endif %}>Restrict image posting:
|
||||||
|
<p class="note">If you need to prevent someone from posting images and URLs, you can do that here. This will also prevent this user from making new accounts on the same IP address.</p>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li class="setting">
|
||||||
|
<p class="settings-label">Purge content:</p>
|
||||||
|
<input name="purge_posts" type="checkbox" />Purge posts:
|
||||||
|
<p class="note">Remove all posts from this user.</p>
|
||||||
|
<input name="purge_comments" type="checkbox" />Purge comments:
|
||||||
|
<p class="note">Remove all comments from this user.</p>
|
||||||
|
<p> </p>
|
||||||
|
<input name="restore_content" type="checkbox" />Restore comments and posts:
|
||||||
|
<p class="note">Restore purged comments and posts from this user.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li class="setting">
|
||||||
|
<div class="center center-input">
|
||||||
|
<p class="settings-label">Metadata:</p>
|
||||||
|
<p class='red'>Each time you view someone's metadata, a log is created.</p>
|
||||||
|
{% if request.user.level >= min_lvl_metadata_perms %}
|
||||||
|
<a href="{% url "main:user-tools-meta" user.username %}">View metadata</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if seen_by %}
|
||||||
|
<h3>Account viewed by:</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Seen by</th>
|
||||||
|
</tr>
|
||||||
|
{% for seen_by in seen_by %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ seen_by.created }}</td>
|
||||||
|
<td>{{ seen_by.from_user }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_seen %}
|
||||||
|
<h3>This user has viewed:</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Seen</th>
|
||||||
|
</tr>
|
||||||
|
{% for has_seen in has_seen %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ has_seen.created }}</td>
|
||||||
|
<td>{{ has_seen.target_user }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button apply-button" value="Save">
|
||||||
|
<p class="note">More settings will be added soon!</p>
|
||||||
|
</div>
|
||||||
|
</form></div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_tags %}
|
||||||
|
<div id="help" class="main-column">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
<h2 class="label">View info for {{ user.username }}</h2>
|
||||||
|
<div class="help-content">
|
||||||
|
<p class="settings-label">Account metadata: Mods under level {{ min_lvl_metadata_perms }} can't see this.</p>
|
||||||
|
<p class='red'>Each time you view someone's metadata, a log is created.</p>
|
||||||
|
<div class="user-data">
|
||||||
|
<p>Like any other site, we collect small bits of information from accounts for security reasons.
|
||||||
|
<h3>General account information:</h3>
|
||||||
|
<p>IP address: <span>{% if user.addr %}{{ user.addr }}{% else %}Data missing{% endif %}
|
||||||
|
<p>Signup IP address: <span>{% if user.signup_addr %}{{ user.signup_addr }}{% else %}Data missing{% endif %}</p>
|
||||||
|
<p>User agent: <span>{% if user.user_agent %}{{ user.user_agent }}{% else %}Data missing{% endif %}
|
||||||
|
<p>Rank: <span>{% if user.staff %}Staff member.{% elif not user.level <= 0 %}Moderator. (Level {{ user.level }}){% else %}Regular user.{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if accountmatch %}
|
||||||
|
<h3>Account(s) found with the same IP address.</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Related account</th>
|
||||||
|
<th>Created</th>
|
||||||
|
</tr>
|
||||||
|
{% for accountmatch in accountmatch %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ accountmatch.username }}</td>
|
||||||
|
<td>{{ accountmatch.created }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if log_attempt %}
|
||||||
|
<h3>Account login history:</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Success</th>
|
||||||
|
<th class="ip">IP</th>
|
||||||
|
<th>User agent</th>
|
||||||
|
</tr>
|
||||||
|
{% for log_attempt in log_attempt %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ log_attempt.created }}</td>
|
||||||
|
<td{% if not log_attempt.success %} style="border: #f44336 2px solid;"{% endif %}>{{ log_attempt.success }}</td>
|
||||||
|
<td class="ip">{{ log_attempt.addr }}</td>
|
||||||
|
<td>{{ log_attempt.user_agent }}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>Error: No login history to report, it was likely deleted.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if seen_by %}
|
||||||
|
<h3>Account viewed by:</h3>
|
||||||
|
<div class="user-data">
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Seen by</th>
|
||||||
|
</tr>
|
||||||
|
{% for seen_by in seen_by %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ seen_by.created }}</td>
|
||||||
|
<td>{{ seen_by.from_user }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>Error: No view history to report, it was likely deleted.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p class='red'>Do I need to state the obvious? Please don't share this, ever!</p>
|
||||||
|
</div></div></div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% block main-body %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column messages"><div class="post-list-outline">
|
||||||
|
<h2 class="label">{{ title }}
|
||||||
|
<button class="button msg-update">Update</button>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
{% message_form request other %}
|
||||||
|
|
||||||
|
{% message_list messages next %}
|
||||||
|
|
||||||
|
</div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% block main-body %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column messages">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
|
||||||
|
<h2 class="label">Messages
|
||||||
|
<span class="message-chk">
|
||||||
|
<input type="checkbox" name="online" value="{% if request.session.messages_online %}n{% else %}1{% endif %}"{% if request.session.messages_online %} checked{% endif %}> Only show online friends
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
<!--
|
||||||
|
{% if friends %}
|
||||||
|
<form class="friend-search search" action="{% url "main:messages" %}">
|
||||||
|
<input type="text" name="query" title="Search friends" placeholder="Search friends" minlength="2" maxlength="16">
|
||||||
|
<input type="submit" value="q" title="Search">
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
-->
|
||||||
|
<div class="list">
|
||||||
|
{% if friends %}
|
||||||
|
<ul class="list-content-with-icon-and-text arrow-list" data-next-page-url="{% if next %}?offset={{ next }}{% endif %}">
|
||||||
|
{% for friend in friends %}
|
||||||
|
<li class="trigger{% if not friend.get_latest_msg.mine and friend.get_latest_msg.read == False %} notify{% endif %}" data-href="{% url "main:messages-view" friend.username %}">
|
||||||
|
{% user_icon_container friend 0 True %}
|
||||||
|
|
||||||
|
<div class="body">
|
||||||
|
<p class="title">
|
||||||
|
<span class="nick-name"><a {% if friend.color %}style=color:{{ friend.color }}{% endif %} href="{% url "main:user-view" friend.username %}">{{ friend.nickname }}</a></span>
|
||||||
|
<span class="id-name">{{ friend.username }}</span>
|
||||||
|
</p>
|
||||||
|
{% if friend.get_latest_msg %}
|
||||||
|
<span class="timestamp">{% time friend.get_latest_msg.created %}</span>
|
||||||
|
<p class="text {% if friend.get_latest_msg.drawing or friend.get_latest_msg.is_rm %}type-memo {% endif %}{% if friend.get_latest_msg.mine %}my{% else %}other{% endif %}">{{ friend.get_latest_msg.trun }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="text placeholder">You haven't exchanged messages with this user yet.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
{% nocontent "You don't have any friends yet." %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_tags %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column messages">
|
||||||
|
<div class="post-list-outline">
|
||||||
|
|
||||||
|
<h2 class="label">{{ title }}</h2>
|
||||||
|
|
||||||
|
<div id="notification-tab-container" class="tab-container">
|
||||||
|
<div class="tab2">
|
||||||
|
<a class="tab-icon-my-news selected" href="{% url "main:notifications" %}">
|
||||||
|
<span class="symbol nf"></span>
|
||||||
|
<span>Notifications</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a class="tab-icon-my-news{% if frs %} notify{% endif %}" href="{% url "main:friend-requests" %}">
|
||||||
|
<span class="symbol fr"></span>
|
||||||
|
<span>Friend Requests</span>
|
||||||
|
{% if frs %}<span class="badge" style></span>{% endif %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="list news-list">
|
||||||
|
{% if notifications %}
|
||||||
|
{% for notification in notifications %}
|
||||||
|
{% user_notification notification request %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% nocontent "No notifications yet." %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load markdown_deux_tags %}
|
||||||
|
{% load closedverse_tags %}{% load closedverse_community %}{% block main-body %}
|
||||||
|
<div class="main-column replyform-bottom"><div class="post-list-outline">
|
||||||
|
<section id="post-content" class="post post-subtype-default">
|
||||||
|
|
||||||
|
<header class="community-container">
|
||||||
|
<h1 class="community-container-heading">
|
||||||
|
<a {% if post.community.clickable %}href="{% url "main:community-view" post.community_id %}"{% endif %}><img src="{{ post.community.icon }}" class="community-icon">{{ post.community.name }}</a>
|
||||||
|
</h1>
|
||||||
|
</header>
|
||||||
|
{% if post.is_mine or post.can_rm %}
|
||||||
|
{% if user.is_active %}
|
||||||
|
<div class="edit-buttons-content">
|
||||||
|
<button type="button" class="symbol button edit-button rm-post-button" data-action="{% url "main:post-rm" post.id %}"><span class="symbol-label">Delete</span></button>
|
||||||
|
{% if post.is_mine and not post.has_edit %}
|
||||||
|
<button type="button" class="symbol button edit-button edit-post-button"><span class="symbol-label">Edit</span></button>
|
||||||
|
{% endif %}
|
||||||
|
{% if post.is_mine and post.screenshot %}
|
||||||
|
<button type="button" class="symbol button edit-button profile-post-button{% if post.is_favorite %} done {% endif %}" data-action="{% if post.is_favorite %}{% url "main:post-unset-profile" post.id %}{% else %}{% url "main:post-set-profile" post.id %}{% endif %}"><span class="symbol-label">Set as profile post</span></button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="user-content">
|
||||||
|
{% user_icon_container post.creator post.feeling %}
|
||||||
|
<div class="user-name-content">
|
||||||
|
{% if post.creator.get_class.1 %}<p class="user-organization">{% user_level post.creator %}</p>{% endif %}
|
||||||
|
{% p_username post.creator %}
|
||||||
|
{% if not post.creator.is_active %}
|
||||||
|
<p style="color: #f00;">Banned</p>
|
||||||
|
{% endif %}
|
||||||
|
<p class="timestamp-container">
|
||||||
|
<span class="timestamp">{% time post.created %}</span>
|
||||||
|
{% if post.drawing %}
|
||||||
|
<span class="spoiler">(drawing)</span>
|
||||||
|
{% endif %}
|
||||||
|
<span class="spoiler-status{% if post.spoils %} spoiler{% endif %}">·Spoilers</span>
|
||||||
|
{% if post.has_edit %}
|
||||||
|
· <span class="spoiler">Edited ({% time post.edited %})</span>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
{% if post.is_mine %}
|
||||||
|
<div id="post-edit" class="none">
|
||||||
|
<form data-action="{% url "main:post-change" post.id %}" id="edit-form" method="post">
|
||||||
|
{% feeling_selector post.feeling %}
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea name="body" class="textarea-text textarea " maxlength="2200" placeholder="Edit your post." data-required="">{{ post.body }}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="post-form-footer-options">
|
||||||
|
<label class="spoiler-button symbol"><input id="is_spoiler" name="is_spoiler" type="checkbox" value="1"{% if post.spoils %} checked{% endif %}>Spoilers</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-buttons">
|
||||||
|
<button type="button" class="cancel-button gray-button">Cancel</button>
|
||||||
|
<button type="submit" class="post-button black-button">Submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div id="the-post">
|
||||||
|
{% if post.drawing %}
|
||||||
|
<p class="post-content-memo"><img src="{{ post.drawing }}" class="post-memo"></p>
|
||||||
|
{% else %}
|
||||||
|
<p class="post-content-text">{{ post.body }}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if post.poll %}
|
||||||
|
<div class="post-poll{% if post.poll.has_vote %} selected{% endif %}" data-action="{% url "main:poll-vote" post.poll.unique_id %}" data-action-unvote="{% url "main:poll-unvote" post.poll.unique_id %}">
|
||||||
|
<a class="poll-votes">{{ post.poll.num_votes }} vote{% if not post.poll.num_votes == 1 %}s{% endif %}</a>
|
||||||
|
<div class="poll-options{% if post.screenshot %} with-background" style="background-image:url('{{ post.screenshot }}')"
|
||||||
|
<div class="poll-background" style="width:50%"></div>{% else %}">{% endif %}
|
||||||
|
{% for choice in post.poll.choices %}
|
||||||
|
<a class="poll-option{% if post.poll.has_vote and post.poll.has_vote.1 == choice %} selected{% endif %}" votes="{{ choice.num_votes }}">
|
||||||
|
{{ choice }}<span class="percentage">%</span>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% elif post.screenshot %}<div class="screenshot-container still-image"><img src="{{ post.screenshot }}"></div>{% endif %}
|
||||||
|
|
||||||
|
{% if post.yt_vid %}
|
||||||
|
<div class="screenshot-container video"><iframe class="youtube-player" type="text/html" width="490" height="276" src="https://www.youtube.com/embed/{{ post.yt_vid }}?rel=0&modestbranding=1&iv_load_policy=3" frameborder="0"></iframe></div>
|
||||||
|
{% elif post.url %}
|
||||||
|
<p class="url-link"><a class="link-confirm" href="{{ post.url }}" target="_blank">{{ post.url }}</a></p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="post-meta">
|
||||||
|
<button type="button" {% if not post.can_yeah %} disabled{% endif %} class="symbol submit yeah-button
|
||||||
|
{% if post.has_yeah %}empathy-added{% endif %}
|
||||||
|
" data-feeling="" data-action="{% url "main:post-add-yeah" post.id %}" data-url-id="{{ post.id }}"><span class="yeah-button-text">{% empathy_txt post.feeling post.has_yeah %}</span></button>
|
||||||
|
<div class="empathy symbol"><span class="symbol-label">Yeahs</span><span class="empathy-count">{{ post.number_yeahs }}</span></div>
|
||||||
|
<div class="reply symbol"><span class="symbol-label">Comments</span><span class="reply-count">{{ all_comment_count }}</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
{% empathy_content yeahs request post.has_yeah %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div id="reply-content">
|
||||||
|
<h2 class="reply-label">Comments</h2>
|
||||||
|
<div class="no-reply-content{% if all_comment_count %} none{% endif %}"><div>
|
||||||
|
<p>This post has no comments.</p>
|
||||||
|
</div></div>
|
||||||
|
{% if all_comment_count > 20 %}
|
||||||
|
<button data-fragment-url="{% url "main:post-comments" post.id %}" class="more-button all-replies-button" data-reply-count="{{ all_comment_count }}"><span class="symbol">Show all comments ({{ all_comment_count }})</span></button>
|
||||||
|
{% endif %}
|
||||||
|
{% post_comments comments %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<h2 class="reply-label">Add a Comment</h2>
|
||||||
|
{% if not request.user.is_authenticated %}
|
||||||
|
<div class="guest-message">
|
||||||
|
<p>You must sign in to post a comment.<br><br>Sign in using a Cedar account to make posts and comments, as well as give Yeahs and follow users.</p>
|
||||||
|
<a href="{% url "main:signup" %}" class="arrow-button"><span>Create an account</span></a>
|
||||||
|
<a href="{% url "main:help-faq" %}" class="arrow-button"><span>FAQ/Frequently Asked Questions</span></a>
|
||||||
|
<a href="{% url "main:help-contact" %}" class="arrow-button"><span>Contact Us</span></a>
|
||||||
|
</div>
|
||||||
|
{% elif not post.can_comment %}
|
||||||
|
<div class="cannot-reply"><div>
|
||||||
|
<p>You cannot comment on this post.</p>
|
||||||
|
</div></div>
|
||||||
|
{% else %}
|
||||||
|
{% comment_form post request.user %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,239 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}{% load closedverse_tags %}
|
||||||
|
{% user_sidebar request user profile 0 %}
|
||||||
|
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">{{ title }}</h2>
|
||||||
|
<form class="setting-form" method="post" action="{% url "main:user-view" user.username %}">
|
||||||
|
<ul class="settings-list">
|
||||||
|
|
||||||
|
{% if profile.cannot_edit %}
|
||||||
|
<p>You cannot change user settings for this account</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not profile.cannot_edit %}
|
||||||
|
<li class="setting-nickname">
|
||||||
|
<p class="settings-label">Nickname</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="screen_name" maxlength="32" placeholder="Nickname" value="{{ user.nickname }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Nickname, up to 32 characters.</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting-profile-comment">
|
||||||
|
<p class="settings-label">Profile comment</p>
|
||||||
|
<textarea class="textarea" name="profile_comment" maxlength="2200" placeholder="Write about yourself here.">{{ profile.comment }}</textarea>
|
||||||
|
<p class="note">Anything you write here will appear on your profile. Remember to keep it brief. Please don't write anything that'll violate <a href="{% url "main:help-rules" %}">Cedar's rules</a>.</p>
|
||||||
|
</li>
|
||||||
|
<!--
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="relationship_visibility">Who should be able to see your friends, followers and following lists?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="relationship_visibility" id="relationship_visibility">
|
||||||
|
<option value="0"{% if profile.relationship_visibility == 0 %} selected{% endif %}>Everyone</option>
|
||||||
|
<option value="1"{% if profile.relationship_visibility == 1 %} selected{% endif %}>My friends</option>
|
||||||
|
<option value="2"{% if profile.relationship_visibility == 2 %} selected{% endif %}>Only me</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
-->
|
||||||
|
<li class="setting-country">
|
||||||
|
<p class="settings-label">Region</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="country" maxlength="64" placeholder="Region" value="{{ profile.country }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Enter your region here. It'll appear on your profile.
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting-email">
|
||||||
|
<p class="settings-label">E-mail address</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="email" maxlength="255" placeholder="Email address" value="{{ user.email }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Please note that your email can be a fake one, however if you need to reset your password, this must be accessible. You can't share emails.</p>
|
||||||
|
{% if user.email %}
|
||||||
|
<p class="settings-label"><label for="email_login">Allow logging in to your account with your e-mail address?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="email_login" id="email_login">
|
||||||
|
<option value="0"{% if profile.email_login == 0 %} selected{% endif %}>Do not allow (username login only)</option>
|
||||||
|
<option value="1"{% if profile.email_login == 1 %} selected{% endif %}>Allow</option>
|
||||||
|
<option value="2"{% if profile.email_login == 2 %} selected{% endif %}>Only allow (email login only)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li class="setting-website">
|
||||||
|
<p class="settings-label">Web URL</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="website" maxlength="255" placeholder="URL" value="{{ profile.weblink }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">If you want to advertise a URL of some sorts on your profile, this is where it goes.</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting-website">
|
||||||
|
<p class="settings-label">Discord Tag</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="external" maxlength="255" placeholder="Discord Tag" value="{{ profile.external }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">Actually, you don't have to put a Discord Tag here, you can put anything here, such as your PlayStation Network account. Discord sure is popular though.</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting-website">
|
||||||
|
<p class="settings-label">What are you?</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="whatareyou" maxlength="255" placeholder="What are you?" value="{{ profile.whatareyou }}">
|
||||||
|
</div>
|
||||||
|
<p class="note">So what exactly are you? Are you a Human, attack helicopter, something in between?</p>
|
||||||
|
</li>
|
||||||
|
<li class="setting-color">
|
||||||
|
<p class="settings-label">Nickname color</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="hidden" name="color" maxlength="7" placeholder="Enter a hex color value here" value="{{ user.color }}">
|
||||||
|
<button class="button color-thing">Open color picker</button>
|
||||||
|
</div>
|
||||||
|
<p class="note">This is the color your nickname will appear as. Leave it blank for the default. It will appear like so.</p>
|
||||||
|
{% user_sidebar_info user %}
|
||||||
|
</li>
|
||||||
|
{% if profile.origin_id %}
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="id_visibility">Who should be able to see your Nintendo Network ID? ({{ profile.origin_id }})</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="id_visibility" id="id_visibility">
|
||||||
|
<option value="0"{% if profile.id_visibility == 0 %} selected{% endif %}>Everyone</option>
|
||||||
|
<option value="1"{% if profile.id_visibility == 1 %} selected{% endif %}>My friends</option>
|
||||||
|
<option value="2"{% if profile.id_visibility == 2 %} selected{% endif %}>Nobody</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="let_friendrequest">Who should be able to send you friend requests?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="let_friendrequest" id="let_friendrequest">
|
||||||
|
<option value="0"{% if profile.let_friendrequest == 0 %} selected{% endif %}>Everyone</option>
|
||||||
|
<option value="1"{% if profile.let_friendrequest == 1 %} selected{% endif %}>People I'm following</option>
|
||||||
|
<option value="2"{% if profile.let_friendrequest == 2 %} selected{% endif %}>Nobody</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="pronoun_dot_is">What's your preferred pronoun?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="pronoun_dot_is" id="pronoun_dot_is">
|
||||||
|
<option value="0"{% if profile.pronoun_is == 0 %} selected{% endif %}>I don't know</option>
|
||||||
|
<option value="1"{% if profile.pronoun_is == 1 %} selected{% endif %}>He/him</option>
|
||||||
|
<option value="2"{% if profile.pronoun_is == 2 %} selected{% endif %}>She/her</option>
|
||||||
|
<option value="3"{% if profile.pronoun_is == 3 %} selected{% endif %}>He/she</option>
|
||||||
|
<option value="4"{% if profile.pronoun_is == 4 %} selected{% endif %}>It</option>
|
||||||
|
<option value="5"{% if profile.pronoun_is == 5 %} selected{% endif %}>They/Them</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="gender_select">Are you a girl, boy or something else?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="gender_select" id="gender_select">
|
||||||
|
<option value="0"{% if profile.gender_is == 0 %} selected{% endif %}>I don't know</option>
|
||||||
|
<option value="1"{% if profile.gender_is == 1 %} selected{% endif %}>Girl</option>
|
||||||
|
<option value="2"{% if profile.gender_is == 2 %} selected{% endif %}>Boy</option>
|
||||||
|
<option value="3"{% if profile.gender_is == 3 %} selected{% endif %}>Minion</option>
|
||||||
|
<option value="4"{% if profile.gender_is == 4 %} selected{% endif %}>Toaster</option>
|
||||||
|
<option value="5"{% if profile.gender_is == 5 %} selected{% endif %}>Dino</option>
|
||||||
|
<option value="6"{% if profile.gender_is == 6 %} selected{% endif %}>Truck</option>
|
||||||
|
<option value="7"{% if profile.gender_is == 7 %} selected{% endif %}>Robot</option>
|
||||||
|
<option value="8"{% if profile.gender_is == 8 %} selected{% endif %}>Monkey</option>
|
||||||
|
<option value="9"{% if profile.gender_is == 9 %} selected{% endif %}>Big chungus</option>
|
||||||
|
<option value="10"{% if profile.gender_is == 10 %} selected{% endif %}>Other</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="yeahs_visibility">Who should be able to see your Yeahs given?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="yeahs_visibility" id="yeahs_visibility">
|
||||||
|
<option value="0"{% if profile.yeahs_visibility == 0 %} selected{% endif %}>Everyone</option>
|
||||||
|
<option value="1"{% if profile.yeahs_visibility == 1 %} selected{% endif %}>My friends</option>
|
||||||
|
<option value="2"{% if profile.yeahs_visibility == 2 %} selected{% endif %}>Nobody</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p class="settings-label"><label for="comments_visibility">Who should be able to see your comments made?</label></p>
|
||||||
|
<div class="select-content">
|
||||||
|
<div class="select-button">
|
||||||
|
<select name="comments_visibility" id="comments_visibility">
|
||||||
|
<option value="0"{% if profile.comments_visibility == 0 %} selected{% endif %}>Everyone</option>
|
||||||
|
<option value="1"{% if profile.comments_visibility == 1 %} selected{% endif %}>My friends</option>
|
||||||
|
<option value="2"{% if profile.comments_visibility == 2 %} selected{% endif %}>Nobody</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="setting-background">
|
||||||
|
<p class="settings-label">Website theme:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="bg_url" maxlength="300" placeholder="Background URL" value="{% if user.bg_url %}{{ user.bg_url }}{% endif %}">
|
||||||
|
</div>
|
||||||
|
<p class="note">To set an image as the background for this site, paste its URL into the box above. Note: this change will only be visible to you.</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="hidden" name="theme" maxlength="7" placeholder="Enter a hex color value here" value="{{ user.theme }}">
|
||||||
|
<button class="button color-thing2">Open color picker</button>
|
||||||
|
</div>
|
||||||
|
<p class="current-theme" style="color:{{ user.theme }}">Remember to save and refresh the page.</p>
|
||||||
|
{% if user.theme %}<input type="checkbox" name="reset-theme">Reset to default{% endif %}
|
||||||
|
{% if settings.site_wide_theme_hex %}<p class="note">Default theme: "{{ settings.site_wide_theme_hex }}"</p>{% endif %}
|
||||||
|
</li>
|
||||||
|
<li class="setting-background">
|
||||||
|
<p class="settings-label">Change your password:</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<p class="note">You can now <a href="{% url "main:change-password" %}">change your password</a>.</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="setting-nnid">
|
||||||
|
<p class="settings-label">Nintendo Network ID</p>
|
||||||
|
<div class="icon-container">
|
||||||
|
<img class="icon nnid-icon mii" src="{% miionly user.mh %}">
|
||||||
|
</div>
|
||||||
|
<input type="text" name="origin_id" minlength="6" maxlength="16" placeholder="Nintendo Network ID{% if not profile.origin_id %} (None){% endif %}" value="{% if profile.origin_id %}{{ profile.origin_id }}{% endif %}" data-action="{% url "main:origin-id-get" %}">
|
||||||
|
<input type="hidden" name="mh" value="{{ user.mh }}">
|
||||||
|
<p class="error"></p>
|
||||||
|
<p class="note">Enter your Nintendo Network ID here. It'll appear on your profile if you set it to be visible.</p>
|
||||||
|
</li>
|
||||||
|
{% if not user.has_plain_avatar %}
|
||||||
|
<li class="setting-avatar">
|
||||||
|
<div class="icon-container">
|
||||||
|
<img class="icon nnid-icon mii{% if not user.has_mh %} none{% endif %}" src="{% miionly user.mh %}">
|
||||||
|
<img class="icon nnid-icon gravatar{% if user.has_mh %} none{% endif %}" src="{{ user.gravatar }}">
|
||||||
|
</div>
|
||||||
|
<p class="settings-label">Do you want the avatar shown beside your content to use the Mii from your Nintendo Network ID or a Gravatar?</p>
|
||||||
|
<label><input type="radio" name="avatar" value="0"{% if user.has_mh %} checked{% endif %}>Mii</label>
|
||||||
|
<label><input type="radio" name="avatar" value="1"{% if not user.has_mh %} checked{% endif %}>Gravatar</label>
|
||||||
|
<p class="note">Selecting the Gravatar option will cause your avatar to be pulled from the <a href="https://gravatar.com">Gravatar account</a> linked to your email address, and feelings won't be shown in your posts unless you choose to use a Mii instead.</p>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<p class="settings-label">It appears that you somehow have a plain URL avatar, change it here (<strong>if you change it to nothing then it will reset to being selectable !!</strong>)</p>
|
||||||
|
<div class="center center-input">
|
||||||
|
<input type="text" name="avatar" maxlength="255" placeholder="Avatar url" value="{{ user.avatar }}">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-buttons">
|
||||||
|
<input type="submit" class="black-button apply-button" value="Save these settings">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</ul></form></div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% block main-body %}
|
||||||
|
<div class="main-column center">
|
||||||
|
<div class="post-list-outline login-page">
|
||||||
|
<form method="post" onload="">
|
||||||
|
<img src="{% static "img/menu-logo.png" %}">
|
||||||
|
<p class="lh">Sign Up</p>
|
||||||
|
<p>Create a Closedverse account to make posts and comments to various communities, give Yeahs to other users' content, and interact with other members of the Closedverse community.</p><br>
|
||||||
|
<p>If you want to be, at least, not sus to us, you can join our Discord Server. https://discord.gg/PXKhXXk</p><br>
|
||||||
|
<p>Please follow <a href="{% url "main:help-rules" %}">our rules</a>. If you don't, mercy will not be laid on yourself.<br><br>You <strong>must</strong> be 13 years of age or older to join, no exceptions.<br>If you are suspected to be younger than 12 years old, the moderators will decide what to do with you.</p>
|
||||||
|
<h3 class="label"><label><span class="red">*$</span> User ID: <input type="text" class="auth-input" name="username" maxlength="32" minlength="4" placeholder="ID"></label></h3>
|
||||||
|
<h3 class="label"><label>Nickname: <input type="text" class="auth-input" name="nickname" maxlength="32" placeholder="Nick/Mii name?"></label></h3>
|
||||||
|
<h3 class="label nnid"><label>Nintendo Network ID: <input type="text" class="auth-input" name="origin_id" maxlength="16" minlength="6" placeholder="NNID" data-action="{% url "main:origin-id-get" %}">
|
||||||
|
<img class="none">
|
||||||
|
</label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">%</span> E-Mail address: <input type="email" class="auth-input" name="email" maxlength="254" minlength="6" placeholder="E-Mail"></label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">*</span> Password: <input type="password" class="auth-input" name="password" maxlength="32" minlength="6" placeholder="Password"></label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">*</span> Confirm password: <input type="password" class="auth-input" name="password_again" maxlength="32" minlength="6" placeholder="Password again"></label></h3>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if recaptcha %}
|
||||||
|
<div class="g-recaptcha" data-sitekey="{{ recaptcha }}" data-theme="dark"></div>
|
||||||
|
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p class="red" style="margin-bottom:6px"></p>
|
||||||
|
<button type="submit" class="button" onclick="event.preventDefault();cac();">Create Account</button>
|
||||||
|
<div class="ll">
|
||||||
|
<p>All fields with a red asterisk (<span class="red">*</span>) are required.</p>
|
||||||
|
<p>NNIDs are only required for getting a Mii and a nickname from.</p>
|
||||||
|
<p>If you do not provide a nickname but provide an NNID, the nickname will be taken from that ID. The ID's nickname, however, is prioritized over the nickname field.</p>
|
||||||
|
<p>You will be able to change your avatar after you sign up.</p>
|
||||||
|
<p><span class="red">%</span>: If you don't fill in your email address, you can't reset your password until you have one.</p>
|
||||||
|
<p><span class="red">$</span>: Your username is used to log in. It'll appear similarly to your NNID on Miiverse, below your nickname.</p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% block main-body %}
|
||||||
|
<div class="main-column center">
|
||||||
|
<div class="post-list-outline login-page">
|
||||||
|
<form method="post" onload="">
|
||||||
|
<img src="{% static "img/menu-logo.png" %}">
|
||||||
|
<p class="lh">Sign Up</p>
|
||||||
|
<p>Create a Cedar account on this instance to access this instance.</p><br>
|
||||||
|
<p>Please follow <a href="{% url "main:help-rules" %}">our rules</a>. If you don't, be careful with your behavior.<br><br>You <strong>must</strong> be {{ age }} years of age or older to join, no exceptions.<br>If you are suspected to be younger than {{ age }} years old, we will ban you until you're {{ age }}.</p>
|
||||||
|
<h3 class="label"><label><span class="red">*$</span> User ID: <input type="text" class="auth-input" name="username" maxlength="32" minlength="4" placeholder="ID"></label></h3>
|
||||||
|
<h3 class="label"><label>Nickname: <input type="text" class="auth-input" name="nickname" maxlength="32" placeholder="Nick/Mii name?"></label></h3>
|
||||||
|
<h3 class="label nnid"><label>Nintendo Network ID: <input type="text" class="auth-input" name="origin_id" maxlength="16" minlength="6" placeholder="NNID" data-action="{% url "main:origin-id-get" %}">
|
||||||
|
<img class="none">
|
||||||
|
</label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">%</span> E-mail address: <input type="email" class="auth-input" name="email" maxlength="254" minlength="6" placeholder="Email"></label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">*</span> Password: <input type="password" class="auth-input" name="password" maxlength="32" minlength="6" placeholder="Password"></label></h3>
|
||||||
|
<h3 class="label"><label><span class="red">*</span> Confirm password: <input type="password" class="auth-input" name="password_again" maxlength="32" minlength="6" placeholder="Password again"></label></h3>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if recaptcha %}
|
||||||
|
<div class="g-recaptcha" data-sitekey="{{ recaptcha }}" data-theme="dark"></div>
|
||||||
|
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<p class="red" style="margin-bottom:6px"></p>
|
||||||
|
<button type="submit" class="button" onclick="event.preventDefault();cac();">Create account</button>
|
||||||
|
<div class="ll">
|
||||||
|
<p>All fields with a red asterisk (<span class="red">*</span>) are required.</p>
|
||||||
|
<p>NNIDs are only required for getting a Mii and a nickname from.</p>
|
||||||
|
<p>If you do not provide a nickname but provide an NNID, the nickname will be taken from that ID. The ID's nickname, however, is prioritized over the nickname field.</p>
|
||||||
|
<p>You will be able to change your avatar after you sign up.</p>
|
||||||
|
<p><span class="red">%</span>: Emails are not required to sign up, however it is used for Gravatar and account recovery.</p>
|
||||||
|
<p><span class="red">$</span>: Your username is used to log in. It'll appear similarly to your NNID on Miiverse, below your nickname.</p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load closedverse_tags %}{% block main-body %}
|
||||||
|
{% nocontent "Sign Ups are disabled for now. Please contact the administrator using the contact page." %}
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% load static %}{% load closedverse_user %}
|
||||||
|
{% block main-body %}
|
||||||
|
{% user_sidebar request user user.profile 0 True %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">Search Users</h2>
|
||||||
|
<form class="search user-search" action="{% url "main:user-search" %}">
|
||||||
|
<input type="text" name="query" value="{{ query }}" placeholder="SMF9, Robby, etc." minlength="1" maxlength="16">
|
||||||
|
<input type="submit" value="q" title="Search">
|
||||||
|
</form>
|
||||||
|
{% if users %}
|
||||||
|
<div class="search-user-content search-content">
|
||||||
|
<p class="user-found note">{{ users|length }} result{% if not users|length == 1 %}s{% endif %} found for "{{ query }}"</p>
|
||||||
|
{% profile_user_list users next request %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="search-user-content no-content search-content">
|
||||||
|
<div class="search-content no-title-content">
|
||||||
|
<p>"{{ query }}" could not be found.<br>
|
||||||
|
Try searching for something different.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{% extends "closedverse_main/layout.html" %}
|
||||||
|
{% block main-body %}{% load closedverse_user %}
|
||||||
|
{% user_sidebar request user profile 6 %}
|
||||||
|
<div class="main-column"><div class="post-list-outline">
|
||||||
|
<h2 class="label">{{ title }}</h2>
|
||||||
|
|
||||||
|
{% u_post_list posts next 3 %}
|
||||||
|
|
||||||
|
</div></div>
|
||||||
|
{% endblock %}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user