Skip to content

Commit 287d24a

Browse files
authored
Merge pull request #12 from ali-zahedi/feat/multi-accounts
feat: support multi accounts
2 parents f4d77b3 + 2ffebb8 commit 287d24a

File tree

7 files changed

+74
-5
lines changed

7 files changed

+74
-5
lines changed

django_telethon/admin.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class LoginAdmin(admin.ModelAdmin):
3232
'created_at',
3333
]
3434
list_filter = ['created_at', 'client_session__name']
35+
raw_id_fields = ('client_session',)
3536

3637

3738
@admin.register(Session)
@@ -92,8 +93,9 @@ def send_a_test_message(self, request, queryset):
9293
@admin.register(UpdateState)
9394
class UpdateStateAdmin(admin.ModelAdmin):
9495
list_display = [
95-
'id',
96+
'pk',
9697
'client_session',
98+
'entity_id',
9799
'pts',
98100
'qts',
99101
'date',
@@ -102,6 +104,14 @@ class UpdateStateAdmin(admin.ModelAdmin):
102104
raw_id_fields = ['client_session']
103105
list_filter = ['client_session__name']
104106

107+
@admin.display(description="client session")
108+
def client_session(self, obj):
109+
return obj.client_session.name
110+
111+
def get_queryset(self, request):
112+
queryset = super().get_queryset(request)
113+
return queryset.select_related('client_session')
114+
105115

106116
@admin.register(SentFile)
107117
class SentFileAdmin(admin.ModelAdmin):

django_telethon/management/commands/runtelegram.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ async def _run_forever():
1616
logging.exception(e, exc_info=True)
1717

1818
while True:
19-
await asyncio.sleep(30)
2019
try:
2120
await re_connect_clients()
2221
except KeyboardInterrupt:
2322
break
2423
except Exception as e:
2524
logging.exception(e, exc_info=True)
25+
await asyncio.sleep(30)
2626

2727

2828
async def _main():
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 5.0.3 on 2024-12-03 14:01
2+
3+
from django.db import migrations, models
4+
5+
6+
def _migrate_from_old_column(apps, schema_editor) -> None:
7+
UpdateState = apps.get_model("django_telethon", "UpdateState")
8+
i = 0
9+
for update_state in UpdateState.objects.all():
10+
i += 1
11+
UpdateState.objects.filter(id=update_state.id).update(id=i, entity_id=update_state.id)
12+
13+
# Step 2: Reset primary keys
14+
with schema_editor.connection.cursor() as cursor:
15+
cursor.execute(f"ALTER SEQUENCE {UpdateState._meta.db_table}_id_seq RESTART WITH {i + 1}")
16+
17+
18+
class Migration(migrations.Migration):
19+
dependencies = [
20+
('django_telethon', '0001_initial'),
21+
]
22+
23+
operations = [
24+
migrations.AddField(
25+
model_name='updatestate',
26+
name='entity_id',
27+
field=models.BigIntegerField(null=True),
28+
),
29+
migrations.RunPython(
30+
_migrate_from_old_column,
31+
reverse_code=lambda x, y: None,
32+
),
33+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 5.0.3 on 2024-12-03 17:53
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
('django_telethon', '0002_updatestate_entity'),
9+
]
10+
11+
operations = [
12+
migrations.AlterField(
13+
model_name='updatestate',
14+
name='entity_id',
15+
field=models.BigIntegerField(db_index=True),
16+
),
17+
migrations.AlterUniqueTogether(
18+
name='updatestate',
19+
unique_together={('client_session', 'entity_id')},
20+
),
21+
]

django_telethon/models/states.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class UpdateState(models.Model):
1212
on_delete=models.CASCADE,
1313
verbose_name=_('Client Session'),
1414
)
15+
entity_id = models.BigIntegerField(db_index=True)
16+
1517
pts = models.IntegerField(
1618
verbose_name=_('pts'),
1719
)
@@ -26,5 +28,6 @@ class UpdateState(models.Model):
2628
)
2729

2830
class Meta:
31+
unique_together = (('client_session', 'entity_id'),)
2932
verbose_name = _('Update state')
3033
verbose_name_plural = _('Update states')

django_telethon/sessions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ def _update_session_table(self):
9797

9898
def get_update_state(self, entity_id):
9999
try:
100-
state = self.client_session.updatestate_set.get(pk=entity_id)
100+
state = self.client_session.updatestate_set.get(entity_id=entity_id)
101101
return types.updates.State(state.pts, state.qts, state.date, state.seq, unread_count=0)
102102
except UpdateState.DoesNotExist:
103103
return None
104104

105105
def set_update_state(self, entity_id, state):
106106
self.client_session.updatestate_set.update_or_create(
107-
pk=entity_id,
107+
entity_id=entity_id,
108108
defaults={
109109
'pts': state.pts,
110110
'qts': state.qts,

django_telethon/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ async def connect_client(client_app, app):
5151
await telegram_client.connect()
5252
if not await telegram_client.is_user_authorized():
5353
client_app.login_status = LoginStatus.LOGIN_REQUIRED
54-
client_app.save()
54+
client_app.save(update_fields=['login_status'])
55+
if client_app.session:
56+
client_app.session.delete()
5557
logging.critical(f"Authorization failed for client: {client_app.name}")
5658
return
5759
if client_app.login_status != LoginStatus.LOGIN_DONE:

0 commit comments

Comments
 (0)