Let social composer send now and rename messy account names.
CI / test (pull_request) Successful in 17s
CI / test (pull_request) Successful in 17s
Closes #5. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+35
-9
@@ -162,6 +162,17 @@ def account_list(request):
|
||||
|
||||
if request.method == "POST":
|
||||
action = (request.POST.get("action") or "connect").strip()
|
||||
if action == "rename":
|
||||
pk = request.POST.get("account_id")
|
||||
account = get_object_or_404(SocialAccount, pk=pk)
|
||||
label = (request.POST.get("label") or "").strip()[:120]
|
||||
if not label:
|
||||
messages.error(request, "Enter a display name.")
|
||||
return redirect("social:account_list")
|
||||
account.label = label
|
||||
account.save(update_fields=["label", "updated_at"])
|
||||
messages.success(request, f"Renamed account to {account.label}.")
|
||||
return redirect("social:account_list")
|
||||
if action == "disconnect":
|
||||
pk = request.POST.get("account_id")
|
||||
account = get_object_or_404(SocialAccount, pk=pk)
|
||||
@@ -361,11 +372,14 @@ def linkedin_oauth_callback(request):
|
||||
profile = linkedin_fetch_member_profile(token_payload["access_token"])
|
||||
author_urn = profile["author_urn"]
|
||||
blob = linkedin_token_blob_from_oauth(token_payload, author_urn=author_urn)
|
||||
existing = SocialAccount.objects.filter(
|
||||
platform=Platform.LINKEDIN, external_id=author_urn
|
||||
).first()
|
||||
account, created = SocialAccount.objects.update_or_create(
|
||||
platform=Platform.LINKEDIN,
|
||||
external_id=author_urn,
|
||||
defaults={
|
||||
"label": profile["label"],
|
||||
"label": SocialAccount.resolve_label(existing, profile["label"]),
|
||||
"encrypted_tokens": encrypt_tokens(json.dumps(blob)),
|
||||
"is_active": True,
|
||||
"owner": request.user,
|
||||
@@ -473,11 +487,14 @@ def meta_oauth_complete(request):
|
||||
)
|
||||
for page in ig_pages:
|
||||
blob = instagram_token_blob(page, user_token=user_token)
|
||||
existing = SocialAccount.objects.filter(
|
||||
platform=Platform.INSTAGRAM, external_id=blob["ig_user_id"]
|
||||
).first()
|
||||
account, created = SocialAccount.objects.update_or_create(
|
||||
platform=Platform.INSTAGRAM,
|
||||
external_id=blob["ig_user_id"],
|
||||
defaults={
|
||||
"label": blob["label"],
|
||||
"label": SocialAccount.resolve_label(existing, blob["label"]),
|
||||
"encrypted_tokens": encrypt_tokens(json.dumps(blob)),
|
||||
"is_active": True,
|
||||
"owner": request.user,
|
||||
@@ -487,12 +504,15 @@ def meta_oauth_complete(request):
|
||||
else:
|
||||
for page in pages:
|
||||
blob = facebook_token_blob(page, user_token=user_token)
|
||||
label = (page.get("name") or "").strip() or f"Page {page['id']}"
|
||||
incoming_label = (page.get("name") or "").strip() or f"Page {page['id']}"
|
||||
existing = SocialAccount.objects.filter(
|
||||
platform=Platform.FACEBOOK, external_id=str(page["id"])
|
||||
).first()
|
||||
account, created = SocialAccount.objects.update_or_create(
|
||||
platform=Platform.FACEBOOK,
|
||||
external_id=str(page["id"]),
|
||||
defaults={
|
||||
"label": label,
|
||||
"label": SocialAccount.resolve_label(existing, incoming_label),
|
||||
"encrypted_tokens": encrypt_tokens(json.dumps(blob)),
|
||||
"is_active": True,
|
||||
"owner": request.user,
|
||||
@@ -525,7 +545,7 @@ def composer(request):
|
||||
form = {
|
||||
"body": "",
|
||||
"prompt": "",
|
||||
"publish_mode": "schedule",
|
||||
"publish_mode": "now",
|
||||
"scheduled_for": "",
|
||||
"account_ids": [],
|
||||
"media_json": "[]",
|
||||
@@ -536,11 +556,17 @@ def composer(request):
|
||||
if request.method == "POST":
|
||||
form["body"] = (request.POST.get("body") or "").strip()
|
||||
form["prompt"] = (request.POST.get("prompt") or "").strip()
|
||||
form["publish_mode"] = (request.POST.get("publish_mode") or "schedule").strip()
|
||||
form["publish_mode"] = (request.POST.get("publish_mode") or "now").strip()
|
||||
form["scheduled_for"] = request.POST.get("scheduled_for") or ""
|
||||
form["account_ids"] = request.POST.getlist("account_ids")
|
||||
form["media_json"] = (request.POST.get("media_json") or "[]").strip() or "[]"
|
||||
action = (request.POST.get("action") or "save").strip()
|
||||
if action == "send_now":
|
||||
form["publish_mode"] = "now"
|
||||
elif action == "schedule":
|
||||
form["publish_mode"] = "schedule"
|
||||
elif action == "save":
|
||||
form["publish_mode"] = "draft"
|
||||
|
||||
if action == "generate" and form["prompt"]:
|
||||
try:
|
||||
@@ -548,7 +574,7 @@ def composer(request):
|
||||
form["body"] = draft
|
||||
except OllamaError as exc:
|
||||
error = str(exc)
|
||||
elif action in {"save", "publish"}:
|
||||
elif action in {"save", "publish", "send_now", "schedule"}:
|
||||
media_items: list = []
|
||||
try:
|
||||
media_items = parse_media_json(form["media_json"])
|
||||
@@ -571,7 +597,7 @@ def composer(request):
|
||||
error = str(exc)
|
||||
else:
|
||||
if not scheduled_for:
|
||||
error = "Pick a schedule date/time, or choose Publish now."
|
||||
error = "Pick a schedule date/time, or choose Send now."
|
||||
else:
|
||||
status = SocialPost.Status.SCHEDULED
|
||||
elif form["publish_mode"] == "now":
|
||||
@@ -614,7 +640,7 @@ def composer(request):
|
||||
publish_social_post.enqueue(post_id=str(post.pk))
|
||||
messages.success(
|
||||
request,
|
||||
"Post queued for publishing to selected accounts.",
|
||||
"Post sent — queued for publishing to selected accounts.",
|
||||
)
|
||||
elif status == SocialPost.Status.SCHEDULED:
|
||||
messages.success(
|
||||
|
||||
Reference in New Issue
Block a user