第一个项目
This commit is contained in:
0
family_rpa/main/__init__.py
Normal file
0
family_rpa/main/__init__.py
Normal file
BIN
family_rpa/main/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/admin.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/apps.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/apps.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/forms.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/forms.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/models.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/urls.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/urls.cpython-313.pyc
Normal file
Binary file not shown.
BIN
family_rpa/main/__pycache__/views.cpython-313.pyc
Normal file
BIN
family_rpa/main/__pycache__/views.cpython-313.pyc
Normal file
Binary file not shown.
16
family_rpa/main/admin.py
Normal file
16
family_rpa/main/admin.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.contrib import admin
|
||||
from .models import File, Message
|
||||
|
||||
@admin.register(File)
|
||||
class FileAdmin(admin.ModelAdmin):
|
||||
list_display = ('file', 'owner', 'created_at', 'is_public')
|
||||
list_filter = ('is_public', 'created_at')
|
||||
search_fields = ('file', 'description')
|
||||
date_hierarchy = 'created_at'
|
||||
|
||||
@admin.register(Message)
|
||||
class MessageAdmin(admin.ModelAdmin):
|
||||
list_display = ('author', 'content', 'created_at', 'ip_address')
|
||||
list_filter = ('created_at', 'ip_address')
|
||||
search_fields = ('author', 'content')
|
||||
date_hierarchy = 'created_at'
|
||||
6
family_rpa/main/apps.py
Normal file
6
family_rpa/main/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MainConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'main'
|
||||
18
family_rpa/main/forms.py
Normal file
18
family_rpa/main/forms.py
Normal file
@@ -0,0 +1,18 @@
|
||||
from django import forms
|
||||
from .models import File, Message
|
||||
|
||||
class FileUploadForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = File
|
||||
fields = ['file', 'description', 'is_public']
|
||||
widgets = {
|
||||
'description': forms.Textarea(attrs={'rows': 3}),
|
||||
}
|
||||
|
||||
class MessageForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Message
|
||||
fields = ['author', 'content']
|
||||
widgets = {
|
||||
'content': forms.Textarea(attrs={'rows': 5}),
|
||||
}
|
||||
11
family_rpa/main/management/commands/cleanup_messages.py
Normal file
11
family_rpa/main/management/commands/cleanup_messages.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.utils import timezone
|
||||
from ...models import Message
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Clean up messages older than 7 days'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
one_week_ago = timezone.now() - timezone.timedelta(days=7)
|
||||
deleted_count, _ = Message.objects.filter(created_at__lt=one_week_ago).delete()
|
||||
self.stdout.write(self.style.SUCCESS(f'Successfully deleted {deleted_count} old messages'))
|
||||
41
family_rpa/main/migrations/0001_initial.py
Normal file
41
family_rpa/main/migrations/0001_initial.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Generated by Django 5.1.4 on 2025-02-15 13:07
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Message',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('author', models.CharField(max_length=100)),
|
||||
('content', models.TextField()),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('ip_address', models.GenericIPAddressField(blank=True, null=True)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-created_at'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='File',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('file', models.FileField(upload_to='uploads/')),
|
||||
('description', models.TextField(blank=True)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('is_public', models.BooleanField(default=False)),
|
||||
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
]
|
||||
21
family_rpa/main/migrations/0002_alter_file_owner.py
Normal file
21
family_rpa/main/migrations/0002_alter_file_owner.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Generated by Django 5.1.4 on 2025-02-15 13:51
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='file',
|
||||
name='owner',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
||||
0
family_rpa/main/migrations/__init__.py
Normal file
0
family_rpa/main/migrations/__init__.py
Normal file
Binary file not shown.
Binary file not shown.
BIN
family_rpa/main/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
family_rpa/main/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
25
family_rpa/main/models.py
Normal file
25
family_rpa/main/models.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
class File(models.Model):
|
||||
owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
|
||||
file = models.FileField(upload_to='uploads/')
|
||||
description = models.TextField(blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
is_public = models.BooleanField(default=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.file.name
|
||||
|
||||
class Message(models.Model):
|
||||
author = models.CharField(max_length=100)
|
||||
content = models.TextField()
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
ip_address = models.GenericIPAddressField(null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return f"来自 {self.author} 的留言"
|
||||
|
||||
class Meta:
|
||||
ordering = ['-created_at']
|
||||
3
family_rpa/main/tests.py
Normal file
3
family_rpa/main/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
9
family_rpa/main/urls.py
Normal file
9
family_rpa/main/urls.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.home, name='home'),
|
||||
path('upload/', views.upload_file, name='upload'),
|
||||
path('delete/<int:file_id>/', views.delete_file, name='delete'),
|
||||
path('message/', views.post_message, name='message'),
|
||||
]
|
||||
53
family_rpa/main/views.py
Normal file
53
family_rpa/main/views.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.http import HttpResponse
|
||||
from django.utils import timezone
|
||||
from django.core.files.storage import default_storage
|
||||
from django.core.paginator import Paginator
|
||||
from .models import File, Message
|
||||
from .forms import FileUploadForm, MessageForm
|
||||
from django.utils.timezone import timedelta
|
||||
|
||||
def home(request):
|
||||
# 获取最近一周的留言
|
||||
one_week_ago = timezone.now() - timedelta(days=7)
|
||||
messages = Message.objects.filter(created_at__gte=one_week_ago).order_by('-created_at')
|
||||
|
||||
# 获取公开文件
|
||||
files = File.objects.filter(is_public=True).order_by('-created_at')
|
||||
|
||||
return render(request, 'main/home.html', {
|
||||
'messages': messages,
|
||||
'files': files
|
||||
})
|
||||
|
||||
def upload_file(request):
|
||||
if request.method == 'POST':
|
||||
form = FileUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
file = form.save(commit=False)
|
||||
if request.user.is_authenticated:
|
||||
file.owner = request.user
|
||||
file.save()
|
||||
return redirect('home')
|
||||
else:
|
||||
form = FileUploadForm()
|
||||
return render(request, 'main/upload.html', {'form': form})
|
||||
|
||||
def delete_file(request, file_id):
|
||||
file = get_object_or_404(File, id=file_id)
|
||||
if request.user == file.owner:
|
||||
file.file.delete()
|
||||
file.delete()
|
||||
return redirect('home')
|
||||
|
||||
def post_message(request):
|
||||
if request.method == 'POST':
|
||||
form = MessageForm(request.POST)
|
||||
if form.is_valid():
|
||||
message = form.save(commit=False)
|
||||
message.ip_address = request.META.get('HTTP_X_FORWARDED_FOR', request.META.get('REMOTE_ADDR'))
|
||||
message.save()
|
||||
return redirect('home')
|
||||
else:
|
||||
form = MessageForm()
|
||||
return render(request, 'main/message.html', {'form': form})
|
||||
Reference in New Issue
Block a user