支持站点用户等级升级信息显示,数据库仍需完善

This commit is contained in:
ngfchl
2023-01-07 23:30:04 +08:00
parent 49b40f682f
commit 989099c4c1
6 changed files with 211 additions and 8 deletions

View File

@@ -13,11 +13,12 @@ import toml
import transmission_rpc
import yaml
from django.contrib.auth.decorators import login_required
from django.forms import model_to_dict
from django.http import JsonResponse, FileResponse, HttpResponse, Http404
from django.shortcuts import render
from pt_site.UtilityTool import MessageTemplate, FileSizeConvert
from pt_site.models import SiteStatus, MySite, Site, Downloader, TorrentInfo
from pt_site.models import SiteStatus, MySite, Site, Downloader, TorrentInfo, UserLevelRule
from pt_site.views import scheduler, pt_spider, exec_command, pool
from ptools.base import CommonResponse, StatusCodeEnum, DownloaderCategory
from ptools.settings import BASE_DIR
@@ -616,6 +617,56 @@ def site_status_api(request):
'seeding_size': site_info.seed_vol,
'last_active': datetime.strftime(site_info.updated_at, '%Y/%m/%d %H:%M:%S'),
}
try:
level_info = my_site.site.userlevelrule_set.filter(level=my_site.my_level).first()
if not level_info:
pass
else:
if level_info.level_id == 0:
site_info.update({
'level_info': model_to_dict(level_info),
})
else:
next_level = UserLevelRule.objects.filter(
site=my_site.site,
level_id=level_info.level_id + 1
).first()
levels = UserLevelRule.objects.filter(
site=my_site.site,
level_id__lte=level_info.level_id
).order_by('-level_id').values_list('level', 'rights')
level_info_dict = model_to_dict(level_info)
level_info_dict.update(
{
'uploaded': FileSizeConvert.parse_2_byte(level_info.uploaded),
'downloaded': FileSizeConvert.parse_2_byte(level_info.downloaded),
# 'rights': [level.rights for level in levels],
'rights': dict(levels),
}
)
next_level_dict = model_to_dict(next_level)
next_level_dict.update(
{
'uploaded': FileSizeConvert.parse_2_byte(next_level.uploaded),
'downloaded': FileSizeConvert.parse_2_byte(next_level.downloaded),
}
)
logger.info(f'我的站点id{my_site.id}')
logger.info(f'当前等级:{level_info_dict}')
logger.info(f'下一等级:{next_level_dict}')
upgrade_day = my_site.time_join + timedelta(days=next_level.days * 7)
logger.info(f'下一等级升级日期:{upgrade_day}')
site_info.update({
'level_info': level_info_dict,
'next_level': next_level_dict,
'upgrade_day': upgrade_day if upgrade_day > datetime.today() else False,
})
except:
# raise
logger.warning(f'{my_site.site.name} 用户升级信息获取错误!')
pass
status_list.append(site_info)
# 按上传量排序
# status_list.sort(key=lambda x: x['mail'], reverse=False)
@@ -654,7 +705,7 @@ def site_status_api(request):
message = f'获取数列列表失败:{e}'
logger.info(message)
logger.error(traceback.format_exc(limit=3))
return CommonResponse.error(msg=message)
return JsonResponse(data=CommonResponse.error(msg=message).to_dict(), safe=False)
@login_required

View File

@@ -206,7 +206,7 @@ class UserLevelRuleAdmin(AjaxAdmin):
'score',
'ratio',
'torrents',
'rights',
# 'rights',
)

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.1.2 on 2023-01-07 21:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pt_site', '0028_userlevelrule'),
]
operations = [
migrations.AlterField(
model_name='userlevelrule',
name='downloaded',
field=models.CharField(default=0, help_text='原样输入50GB1.5TB', max_length=12, verbose_name='下 载'),
),
migrations.AlterField(
model_name='userlevelrule',
name='uploaded',
field=models.CharField(default=0, help_text='原样输入50GB1.5TB', max_length=12, verbose_name='上 传'),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.1.2 on 2023-01-07 22:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pt_site', '0029_alter_userlevelrule_downloaded_and_more'),
]
operations = [
migrations.AlterField(
model_name='userlevelrule',
name='days',
field=models.IntegerField(default=0, help_text='原样输入,单位:周', verbose_name='时 间'),
),
migrations.AlterField(
model_name='userlevelrule',
name='level',
field=models.CharField(default='User', help_text='请去除空格', max_length=24, verbose_name='等 级'),
),
migrations.AlterField(
model_name='userlevelrule',
name='rights',
field=models.TextField(help_text='当前等级所享有的权利与义务', max_length=256, verbose_name='权 利'),
),
]

View File

@@ -265,15 +265,15 @@ class Site(BaseEntity):
class UserLevelRule(BaseEntity):
site = models.ForeignKey(verbose_name='站 点', to=Site, on_delete=models.CASCADE)
level_id = models.IntegerField(verbose_name='等级id', default=1)
level = models.CharField(verbose_name='等 级', default='User', max_length=24)
days = models.IntegerField(verbose_name='时 间', default=0, help_text='单位:')
uploaded = models.IntegerField(verbose_name='上 传', default=0, help_text='单位GB')
downloaded = models.IntegerField(verbose_name='下 载', default=0, help_text='单位GB')
level = models.CharField(verbose_name='等 级', default='User', max_length=24, help_text='请去除空格')
days = models.IntegerField(verbose_name='时 间', default=0, help_text='原样输入,单位:')
uploaded = models.CharField(verbose_name='上 传', default=0, help_text='原样输入50GB1.5TB', max_length=12)
downloaded = models.CharField(verbose_name='下 载', default=0, help_text='原样输入50GB1.5TB', max_length=12)
bonus = models.IntegerField(verbose_name='魔 力', default=0)
score = models.IntegerField(verbose_name='积 分', default=0)
ratio = models.FloatField(verbose_name='分享率', default=0)
torrents = models.IntegerField(verbose_name='发 种', default=0)
rights = models.CharField(verbose_name='权 利', max_length=128,
rights = models.TextField(verbose_name='权 利', max_length=256,
help_text='当前等级所享有的权利与义务')
def __str__(self):

View File

@@ -55,6 +55,18 @@
height: 35px !important;
}
.incomplete {
color: red;
}
.complete {
color: darkgreen;
}
th {
width: 70px;
text-align: right;
}
</style>
</head>
<body>
@@ -248,7 +260,94 @@
</div>
<span style="font-size: 10px;float: right;">
<el-popover
v-if="site.level_info"
placement="top"
width="440"
trigger="hover">
<table style="font-size: 10px;font-family: 'Heiti SC';margin-right: 5px;">
<tr v-if="site.level_info">
<th>当前等级:</th>
<td class="complete"><span v-text="site.level_info.level"></span></td>
</tr>
<tr v-if="site.next_level">
<th>下一等级:</th>
<td class="incomplete"><span v-text="site.next_level.level"></span></td>
</tr>
<tr v-if="site.upgrade_day">
<th>升级时间:</th>
<td><span v-text="site.upgrade_day.replace('T',' ')"
class="incomplete"></span></td>
</tr>
<tr v-if="site.next_level && site.next_level.uploaded > site.uploaded">
<th>上传量:</th>
<td><span v-text="renderSize(site.uploaded)"
class="incomplete"></span> / <span
v-text="renderSize(site.next_level.downloaded * site.next_level.ratio)">
</span></td>
</tr>
<tr v-if="site.next_level && site.next_level.downloaded > site.downloaded">
<th>下载量:</th>
<td><span v-text="renderSize(site.downloaded)" class="incomplete"></span> /
<span v-text="renderSize(site.next_level.downloaded)"></span></td>
</tr>
<tr v-if="site.next_level && site.next_level.bonus != 0 && site.next_level.bonus > site.sp">
<th>魔力:</th>
<td><span v-text="site.sp" class="incomplete"></span> / <span
v-text="site.next_level.bonus"></span></td>
</tr>
<tr v-if="site.next_level && site.next_level.score != 0 && site.next_level.score > site.bonus">
<th>
积分:
</th>
<td>
<span v-text="site.bonus" class="incomplete"></span> / <span
v-text="site.next_level.score"></span
</td>
</tr>
<tr v-if="site.next_level && site.next_level.torrents != 0">
<th>分享率:</th>
<td><span v-text="site.level_info.ratio"
class="incomplete"></span> / <span
v-text="site.next_level.ratio"></span></td>
</tr>
<tr v-if="site.next_level && site.next_level.torrents != 0">
<th>发种数:<th>
<td><span v-text="site.level_info.torrents"
class="incomplete"></span> / <span
v-text="site.next_level.torrents"></span></td>
</tr>
<tr>
<th colspan="2" style="text-align: center"><h3>权益:</h3></th>
</tr>
<tr v-if="site.next_level">
<th>即将拥有:
</th>
<td>
<span class="incomplete"
v-text="site.next_level.rights"></span>
</td>
</tr>
<tr>
<th>已拥有:</th>
<td style="color: darkgreen;">
<div v-if="site.next_level">
<div v-for="value,index in site.level_info.rights">
<i class="el-icon-star-on" v-text="`${index}${value}`"></i>
</div>
</div>
<div v-else="site.next_level">
<i class="el-icon-star-on"
v-text="site.level_info.rights"></i>
</div>
</td>
</tr>
</table>
<i class="el-icon-user-solid" v-text="' ' + site.class" style="color: indianred"
slot="reference"></i>
</el-popover>
<i class="el-icon-user-solid" v-text="' ' + site.class" style="color: indianred"
v-else="site.level_info"
title="用户等级"></i>
<br v-if="site.hr == 0 && site.mail <= 0">
<i class="el-icon-postcard" v-text="' ' + site.invite" style="color: #003366"
@@ -625,6 +724,8 @@
}
},
methods: {
showUserLever() {
},
getTorrent(id) {
axios.get(
"{% url 'get_site_torrents' %}" + `?id=${id}`