remove relinking

master
Aevann 2023-02-18 16:55:18 +02:00
parent a5b006e9ad
commit ef2bda6920
3 changed files with 17 additions and 32 deletions

View File

@ -1,13 +1,7 @@
function submitAddAlt(element, username) { function submitAddAlt(element, username) {
const isLinking = element.id == 'add-alt-form-link';
const otherElement = isLinking ? document.getElementById('add-alt-form-delink') : document.getElementById('add-alt-form-link');
if (!otherElement) return;
element.disabled = true; element.disabled = true;
otherElement.disabled = true;
element.classList.add('disabled'); element.classList.add('disabled');
otherElement.classList.add('disabled');
const form = new FormData(); const form = new FormData();
if (!isLinking) form.append('deleted', 'true');
form.append('other_username', document.getElementById('link-input-other').value); form.append('other_username', document.getElementById('link-input-other').value);
const xhr = createXhrWithFormKey(`/@${username}/alts/`, 'POST', form); const xhr = createXhrWithFormKey(`/@${username}/alts/`, 'POST', form);
xhr[0].onload = function() { xhr[0].onload = function() {
@ -24,10 +18,17 @@ function submitAddAlt(element, username) {
} else { } else {
showToast(false, getMessageFromJsonData(false, data)); showToast(false, getMessageFromJsonData(false, data));
element.disabled = false; element.disabled = false;
otherElement.disabled = false;
element.classList.remove('disabled'); element.classList.remove('disabled');
otherElement.classList.remove('disabled');
} }
} }
xhr[0].send(xhr[1]); xhr[0].send(xhr[1]);
} }
function delink(t, url) {
postToast(t, url,
{},
() => {
t.parentElement.parentElement.remove()
}
);
}

View File

@ -641,35 +641,27 @@ def admin_add_alt(v:User, username):
g.db.add(ma) g.db.add(ma)
return {"message": f"{word} @{user1.username} and @{user2.username} successfully!"} return {"message": f"{word} @{user1.username} and @{user2.username} successfully!"}
@app.route('/@<username>/alts/<int:other>/deleted', methods=["PUT", "DELETE"]) @app.post('/@<username>/alts/<int:other>/deleted')
@limiter.limit(DEFAULT_RATELIMIT_SLOWER) @limiter.limit(DEFAULT_RATELIMIT_SLOWER)
@limiter.limit(DEFAULT_RATELIMIT_SLOWER, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT_SLOWER, key_func=get_ID)
@admin_level_required(PERMS['USER_LINK']) @admin_level_required(PERMS['USER_LINK'])
def admin_delink_relink_alt(v:User, username, other): def admin_delink_relink_alt(v:User, username, other):
is_delinking = request.method == 'PUT' # we're adding the 'deleted' state if a PUT request
user1 = get_user(username) user1 = get_user(username)
user2 = get_account(other) user2 = get_account(other)
ids = [user1.id, user2.id] ids = [user1.id, user2.id]
a = g.db.query(Alt).filter(Alt.user1.in_(ids), Alt.user2.in_(ids)).one_or_none() a = g.db.query(Alt).filter(Alt.user1.in_(ids), Alt.user2.in_(ids)).one_or_none()
if not a: abort(404) if not a: abort(404)
a.deleted = is_delinking g.db.delete(a)
g.db.add(a)
g.db.flush()
check_for_alts(user1)
check_for_alts(user2)
word = 'Delinked' if is_delinking else 'Relinked'
ma_word = 'delink' if is_delinking else 'link'
note = f'from @{user2.username}' if is_delinking else f'with @{user2.username} (relinked)'
ma = ModAction( ma = ModAction(
kind=f"{ma_word}_accounts", kind=f"delink_accounts",
user_id=v.id, user_id=v.id,
target_user_id=user1.id, target_user_id=user1.id,
_note=note _note=f'from @{user2.username}'
) )
g.db.add(ma) g.db.add(ma)
return {"message": f"{word} @{user1.username} and @{user2.username} successfully!"} return {"message": f"Delinked @{user1.username} and @{user2.username} successfully!"}
@app.get("/admin/removed/posts") @app.get("/admin/removed/posts")

View File

@ -26,9 +26,7 @@
<th>#</th> <th>#</th>
<th>Name</th> <th>Name</th>
<th class="disable-sort-click">Account Created</th> <th class="disable-sort-click">Account Created</th>
<th>Alt Link Created</th>
<th>Manual</th> <th>Manual</th>
<th class="disable-sort-click">Delinked</th>
<th class="disable-sort-click">Actions</th> <th class="disable-sort-click">Actions</th>
</tr> </tr>
</thead> </thead>
@ -37,11 +35,9 @@
<td>{{loop.index}}</td> <td>{{loop.index}}</td>
<td>{% include "user_in_table.html" %}</td> <td>{% include "user_in_table.html" %}</td>
<td>{{user.created_utc|timestamp}}</td> <td>{{user.created_utc|timestamp}}</td>
<td>{{user._alt_created_utc|timestamp}}</td>
<td>{{user._is_manual}}</td> <td>{{user._is_manual}}</td>
<td> <td>
<button type="button" id="delink-alt-{{u.id}}-{{user.id}}" class="btn btn-danger" data-nonce="{{g.nonce}}" data-onclick="postToastSwitch(this,'/@{{u.username}}/alts/{{user.id}}/deleted', 'delink-alt-{{u.id}}-{{user.id}}', 'relink-alt-{{u.id}}-{{user.id}}', 'd-none', 'null', 'PUT')">Delink</button> <button type="button" id="delink-alt-{{u.id}}-{{user.id}}" class="btn btn-danger" data-nonce="{{g.nonce}}" data-onclick="delink(this,'/@{{u.username}}/alts/{{user.id}}/deleted')">Delink</button>
<button type="button" id="relink-alt-{{u.id}}-{{user.id}}" class="btn btn-danger" data-nonce="{{g.nonce}}" data-onclick="postToastSwitch(this,'/@{{u.username}}/alts/{{user.id}}/deleted', 'relink-alt-{{u.id}}-{{user.id}}', 'delink-alt-{{u.id}}-{{user.id}}', 'd-none', 'null', 'DELETE')">Relink</button>
<a class="btn btn-secondary" href="/@{{user.username}}/alts">Alts</a> <a class="btn btn-secondary" href="/@{{user.username}}/alts">Alts</a>
{% if v.admin_level >= PERMS['VIEW_ALT_VOTES'] %} {% if v.admin_level >= PERMS['VIEW_ALT_VOTES'] %}
<a class="btn btn-secondary" href="/admin/alt_votes/?u1={{u.username}}&u2={{user.username}}">Alt Votes</a> <a class="btn btn-secondary" href="/admin/alt_votes/?u1={{u.username}}&u2={{user.username}}">Alt Votes</a>
@ -53,14 +49,10 @@
</div> </div>
<section id="add-alt" class="rounded rounded-section p-3"> <section id="add-alt" class="rounded rounded-section p-3">
<h5>Add Alt</h5> <h5>Add Alt</h5>
<p>This tool allows you to add an alt either linked or delinked.<br> <p>This tool allows you to link an alt.</p>
Adding linked will link the two alts together manually, while adding delinked will attempt to delink alts whereever possible.<br>
You're on your own for reversing any propagation though.
</p>
<label for="link-input-other">Other Username</label> <label for="link-input-other">Other Username</label>
<input autocomplete="off" id="link-input-other" type="text" class="form-control mb-2" name="other_username" placeholder="Other Username"> <input autocomplete="off" id="link-input-other" type="text" class="form-control mb-2" name="other_username" placeholder="Other Username">
<button id="add-alt-form-link" class="btn btn-danger mr-3" data-areyousure="submitAddAlt(this, '{{u.username}}')" data-nonce="{{g.nonce}}" data-onclick="areyousure(this)">Add Alt Linked</button> <button id="add-alt-form-link" class="btn btn-danger mr-3" data-areyousure="submitAddAlt(this, '{{u.username}}')" data-nonce="{{g.nonce}}" data-onclick="areyousure(this)">Add Alt</button>
<button id="add-alt-form-delink" class="btn btn-danger" data-areyousure="submitAddAlt(this, '{{u.username}}')" data-nonce="{{g.nonce}}" data-onclick="areyousure(this)">Add Alt Delinked</button>
</section> </section>
{% endif %} {% endif %}