embeded pandora mobile view

This commit is contained in:
j 2023-07-15 13:00:36 +05:30
commit b420bf43b7
45 changed files with 3437 additions and 0 deletions

0
app/item/__init__.py Normal file
View file

23
app/item/admin.py Normal file
View file

@ -0,0 +1,23 @@
from django.contrib import admin
from . import models
class ItemAdmin(admin.ModelAdmin):
search_fields = ['title', 'description', 'url']
list_display = ['__str__', 'id', 'published']
list_filter = (
("published", admin.EmptyFieldListFilter),
)
admin.site.register(models.Item, ItemAdmin)
class CommentAdmin(admin.ModelAdmin):
search_fields = ['item__title', 'item__url', 'text', 'name', 'email']
list_display = ['__str__', 'published']
list_filter = (
("published", admin.EmptyFieldListFilter),
)
admin.site.register(models.Comment, CommentAdmin)

6
app/item/apps.py Normal file
View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ItemConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "app.item"

View file

@ -0,0 +1,74 @@
# Generated by Django 4.2.3 on 2023-07-11 16:06
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="Comment",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created", models.DateTimeField(auto_now_add=True)),
("modified", models.DateTimeField(auto_now=True)),
("name", models.CharField(max_length=1024)),
("email", models.CharField(max_length=1024)),
("text", models.TextField(blank=True, default="")),
("data", models.JSONField(default=dict, editable=False)),
("published", models.DateTimeField(default=None, null=True)),
],
),
migrations.CreateModel(
name="Item",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created", models.DateTimeField(auto_now_add=True)),
("modified", models.DateTimeField(auto_now=True)),
("url", models.CharField(max_length=1024, unique=True)),
("title", models.CharField(max_length=1024)),
("description", models.TextField(blank=True, default="")),
("published", models.DateTimeField(default=datetime.datetime.now)),
("announced", models.DateTimeField(default=None, null=True)),
("data", models.JSONField(default=dict, editable=False)),
],
),
migrations.CreateModel(
name="Settings",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created", models.DateTimeField(auto_now_add=True)),
("modified", models.DateTimeField(auto_now=True)),
("key", models.CharField(max_length=1024, unique=True)),
("value", models.JSONField(default=dict, editable=False)),
],
),
]

View file

@ -0,0 +1,46 @@
# Generated by Django 4.2.3 on 2023-07-11 16:06
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),
("item", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="item",
name="user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="items",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="comment",
name="item",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="comments",
to="item.item",
),
),
migrations.AddField(
model_name="comment",
name="user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="comments",
to=settings.AUTH_USER_MODEL,
),
),
]

View file

104
app/item/models.py Normal file
View file

@ -0,0 +1,104 @@
from django.utils.timezone import datetime, timedelta
from django.utils import timezone
import json
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
User = get_user_model()
class Settings(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
key = models.CharField(max_length=1024, unique=True)
value = models.JSONField(default=dict, editable=False)
class Item(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, null=True, related_name='items', on_delete=models.CASCADE)
url = models.CharField(max_length=1024, unique=True)
title = models.CharField(max_length=1024)
description = models.TextField(default="", blank=True)
published = models.DateTimeField(default=timezone.now, null=True, blank=True)
announced = models.DateTimeField(null=True, default=None, blank=True)
data = models.JSONField(default=dict, editable=False)
def __str__(self):
return '%s (%s)' % (self.title, self.url)
def public_comments(self):
return self.comments.exclude(published=None)
def public_comments_json(self):
comments = []
for comment in self.public_comments():
comments.append({
"name": comment.name,
"date": comment.date,
"text": comment.text,
})
return json.dumps(comments)
@classmethod
def public(cls):
now = timezone.now()
qs = cls.objects.exclude(published=None).filter(published__lte=now).order_by('-published')
cal = now.date().isocalendar()
monday = now.date() - timedelta(days=now.date().isocalendar().weekday - 1)
monday = timezone.datetime(monday.year, monday.month, monday.day, tzinfo=now.tzinfo)
print(now.tzinfo)
first_post = qs.filter(published__gt=monday).first()
print('!!', first_post.published, now, first_post.published > now)
if first_post.published < now:
print('only this week')
week = qs.filter(published__gt=monday)
else:
print('only last week')
last_monday = monday - timedelta(days=7)
week = qs.filter(published__gt=last_monday)
archive = qs.exclude(id__in=week)
return week, archive
def get_absolute_url(self):
return reverse('item', kwargs={'id': self.id})
class Comment(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
item = models.ForeignKey(Item, related_name='comments', on_delete=models.CASCADE)
user = models.ForeignKey(User, null=True, related_name='comments', on_delete=models.CASCADE, blank=True)
name = models.CharField(max_length=1024)
email = models.CharField(max_length=1024)
text = models.TextField(default="", blank=True)
data = models.JSONField(default=dict, editable=False)
published = models.DateTimeField(null=True, default=None)
def __str__(self):
return '%s: %s' % (self.item, self.user)
def save(self, *args, **kwargs):
if self.user:
self.name = self.user.username
self.email = self.user.email
super().save(*args, **kwargs)
@property
def date(self):
return self.created.strftime('%Y-%m-%d %H:%M')
def json(self):
data = {}
data['name'] = self.name
data['date'] = self.date
data['text'] = self.text
return data

3
app/item/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

51
app/item/views.py Normal file
View file

@ -0,0 +1,51 @@
from datetime import date, datetime, timedelta
from django.shortcuts import render
from . import models
def index(request):
context = {}
week, archive = models.Item.public()
context['items'] = week
context['archive'] = archive.exists()
return render(request, 'index.html', context)
def archive(request):
context = {}
qs = models.Item.public()
week, archive = models.Item.public()
context['items'] = archive
return render(request, 'archive.html', context)
def item(request, id):
context = {}
item = models.Item.objects.get(id=id)
context['item'] = item
return render(request, 'item.html', context)
import json
from django.http import Http404, HttpResponse
def render_to_json(response):
content = json.dumps(response)
return HttpResponse(content, 'application/json; charset=utf-8')
def comment(request):
response = {}
data = json.loads(request.body)
print(data)
comment = models.Comment()
comment.item = models.Item.objects.get(id=data['item'])
if request.user.is_authenticated:
comment.user = request.user
comment.published = datetime.now()
else:
comment.name = data['name']
comment.email = data['email']
comment.text = data['text']
comment.save()
response = comment.json()
return render_to_json(response)