mirror of https://github.com/zulip/zulip.git
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output of lint with flake8-comma: import re import sys last_filename = None last_row = None lines = [] for msg in sys.stdin: m = re.match( r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg ) if m: filename, row_str, col_str, err = m.groups() row, col = int(row_str), int(col_str) if filename == last_filename: assert last_row != row else: if last_filename is not None: with open(last_filename, "w") as f: f.writelines(lines) with open(filename) as f: lines = f.readlines() last_filename = filename last_row = row line = lines[row - 1] if err in ["C812", "C815"]: lines[row - 1] = line[: col - 1] + "," + line[col - 1 :] elif err in ["C819"]: assert line[col - 2] == "," lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ") if last_filename is not None: with open(last_filename, "w") as f: f.writelines(lines) Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
This commit is contained in:
parent
b114eb2f10
commit
69730a78cc
|
@ -325,9 +325,9 @@ def sql_data_collector(
|
|||
def do_pull_minutes_active(property: str, start_time: datetime, end_time: datetime,
|
||||
realm: Optional[Realm] = None) -> int:
|
||||
user_activity_intervals = UserActivityInterval.objects.filter(
|
||||
end__gt=start_time, start__lt=end_time
|
||||
end__gt=start_time, start__lt=end_time,
|
||||
).select_related(
|
||||
'user_profile'
|
||||
'user_profile',
|
||||
).values_list(
|
||||
'user_profile_id', 'user_profile__realm_id', 'start', 'end')
|
||||
|
||||
|
@ -660,7 +660,7 @@ def get_count_stats(realm: Optional[Realm]=None) -> Dict[str, CountStat]:
|
|||
sql_data_collector(
|
||||
RealmCount, count_realm_active_humans_query(realm), None),
|
||||
CountStat.DAY,
|
||||
dependencies=['active_users_audit:is_bot:day', '15day_actives::day'])
|
||||
dependencies=['active_users_audit:is_bot:day', '15day_actives::day']),
|
||||
]
|
||||
|
||||
return OrderedDict([(stat.property, stat) for stat in count_stats_])
|
||||
|
|
|
@ -24,7 +24,7 @@ def analyze_activity(options: Dict[str, Any]) -> None:
|
|||
continue
|
||||
|
||||
total_duration += duration
|
||||
print("%-*s%s" % (37, user_profile.email, duration,))
|
||||
print("%-*s%s" % (37, user_profile.email, duration))
|
||||
|
||||
print(f"\nTotal Duration: {total_duration}")
|
||||
print(f"\nTotal Duration in minutes: {total_duration.total_seconds() / 60.}")
|
||||
|
|
|
@ -16,7 +16,7 @@ states = {
|
|||
0: "OK",
|
||||
1: "WARNING",
|
||||
2: "CRITICAL",
|
||||
3: "UNKNOWN"
|
||||
3: "UNKNOWN",
|
||||
}
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
|
|
@ -57,7 +57,7 @@ class InstallationCount(BaseCount):
|
|||
UniqueConstraint(
|
||||
fields=["property", "end_time"],
|
||||
condition=Q(subgroup__isnull=True),
|
||||
name='unique_installation_count_null_subgroup')
|
||||
name='unique_installation_count_null_subgroup'),
|
||||
]
|
||||
|
||||
def __str__(self) -> str:
|
||||
|
@ -76,7 +76,7 @@ class RealmCount(BaseCount):
|
|||
UniqueConstraint(
|
||||
fields=["realm", "property", "end_time"],
|
||||
condition=Q(subgroup__isnull=True),
|
||||
name='unique_realm_count_null_subgroup')
|
||||
name='unique_realm_count_null_subgroup'),
|
||||
]
|
||||
index_together = ["property", "end_time"]
|
||||
|
||||
|
@ -97,7 +97,7 @@ class UserCount(BaseCount):
|
|||
UniqueConstraint(
|
||||
fields=["user", "property", "end_time"],
|
||||
condition=Q(subgroup__isnull=True),
|
||||
name='unique_user_count_null_subgroup')
|
||||
name='unique_user_count_null_subgroup'),
|
||||
]
|
||||
# This index dramatically improves the performance of
|
||||
# aggregating from users to realms
|
||||
|
@ -120,7 +120,7 @@ class StreamCount(BaseCount):
|
|||
UniqueConstraint(
|
||||
fields=["stream", "property", "end_time"],
|
||||
condition=Q(subgroup__isnull=True),
|
||||
name='unique_stream_count_null_subgroup')
|
||||
name='unique_stream_count_null_subgroup'),
|
||||
]
|
||||
# This index dramatically improves the performance of
|
||||
# aggregating from streams to realms
|
||||
|
|
|
@ -403,7 +403,7 @@ class TestSupportEndpoint(ZulipTestCase):
|
|||
self.assert_in_success_response(['<span class="label">user</span>\n', '<h3>King Hamlet</h3>',
|
||||
'<b>Email</b>: hamlet@zulip.com', '<b>Is active</b>: True<br>',
|
||||
'<b>Admins</b>: desdemona@zulip.com, iago@zulip.com\n',
|
||||
'class="copy-button" data-copytext="desdemona@zulip.com, iago@zulip.com"'
|
||||
'class="copy-button" data-copytext="desdemona@zulip.com, iago@zulip.com"',
|
||||
], result)
|
||||
|
||||
def check_zulip_realm_query_result(result: HttpResponse) -> None:
|
||||
|
@ -448,19 +448,19 @@ class TestSupportEndpoint(ZulipTestCase):
|
|||
self.assert_in_success_response(['<span class="label">preregistration user</span>\n',
|
||||
'<span class="label">realm creation</span>\n',
|
||||
'<b>Link</b>: http://zulip.testserver/accounts/do_confirm/',
|
||||
'<b>Expires in</b>: 1\xa0day<br>\n'
|
||||
'<b>Expires in</b>: 1\xa0day<br>\n',
|
||||
], result)
|
||||
|
||||
def check_multiuse_invite_link_query_result(result: HttpResponse) -> None:
|
||||
self.assert_in_success_response(['<span class="label">multiuse invite</span>\n',
|
||||
'<b>Link</b>: http://zulip.testserver/join/',
|
||||
'<b>Expires in</b>: 1\xa0week, 3'
|
||||
'<b>Expires in</b>: 1\xa0week, 3',
|
||||
], result)
|
||||
|
||||
def check_realm_reactivation_link_query_result(result: HttpResponse) -> None:
|
||||
self.assert_in_success_response(['<span class="label">realm reactivation</span>\n',
|
||||
'<b>Link</b>: http://zulip.testserver/reactivate/',
|
||||
'<b>Expires in</b>: 1\xa0day'
|
||||
'<b>Expires in</b>: 1\xa0day',
|
||||
], result)
|
||||
|
||||
self.login('cordelia')
|
||||
|
|
|
@ -401,7 +401,7 @@ def make_table(title: str, cols: List[str], rows: List[Any], has_row_class: bool
|
|||
|
||||
content = loader.render_to_string(
|
||||
'analytics/ad_hoc_query.html',
|
||||
dict(data=data)
|
||||
dict(data=data),
|
||||
)
|
||||
|
||||
return content
|
||||
|
@ -590,7 +590,7 @@ def realm_summary_table(realm_minutes: Dict[str, float]) -> str:
|
|||
realm_admins: Dict[str, List[str]] = defaultdict(list)
|
||||
for up in UserProfile.objects.select_related("realm").filter(
|
||||
role=UserProfile.ROLE_REALM_ADMINISTRATOR,
|
||||
is_active=True
|
||||
is_active=True,
|
||||
):
|
||||
realm_admins[up.realm.string_id].append(up.delivery_email)
|
||||
|
||||
|
@ -674,7 +674,7 @@ def realm_summary_table(realm_minutes: Dict[str, float]) -> str:
|
|||
content = loader.render_to_string(
|
||||
'analytics/realm_summary_table.html',
|
||||
dict(rows=rows, num_active_sites=num_active_sites,
|
||||
now=now.strftime('%Y-%m-%dT%H:%M:%SZ'))
|
||||
now=now.strftime('%Y-%m-%dT%H:%M:%SZ')),
|
||||
)
|
||||
return content
|
||||
|
||||
|
@ -688,18 +688,18 @@ def user_activity_intervals() -> Tuple[mark_safe, Dict[str, float]]:
|
|||
|
||||
all_intervals = UserActivityInterval.objects.filter(
|
||||
end__gte=day_start,
|
||||
start__lte=day_end
|
||||
start__lte=day_end,
|
||||
).select_related(
|
||||
'user_profile',
|
||||
'user_profile__realm'
|
||||
'user_profile__realm',
|
||||
).only(
|
||||
'start',
|
||||
'end',
|
||||
'user_profile__delivery_email',
|
||||
'user_profile__realm__string_id'
|
||||
'user_profile__realm__string_id',
|
||||
).order_by(
|
||||
'user_profile__realm__string_id',
|
||||
'user_profile__delivery_email'
|
||||
'user_profile__delivery_email',
|
||||
)
|
||||
|
||||
by_string_id = lambda row: row.user_profile.realm.string_id
|
||||
|
@ -735,7 +735,7 @@ def sent_messages_report(realm: str) -> str:
|
|||
cols = [
|
||||
'Date',
|
||||
'Humans',
|
||||
'Bots'
|
||||
'Bots',
|
||||
]
|
||||
|
||||
query = SQL('''
|
||||
|
@ -833,7 +833,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
|||
|
||||
return dict(
|
||||
content=content,
|
||||
title=title
|
||||
title=title,
|
||||
)
|
||||
|
||||
pages = []
|
||||
|
@ -868,7 +868,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
|||
'User id',
|
||||
'Name',
|
||||
'Hits',
|
||||
'Last time'
|
||||
'Last time',
|
||||
]
|
||||
|
||||
pages.append(get_page(query, cols, title))
|
||||
|
@ -898,7 +898,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
|||
'Realm',
|
||||
'Client',
|
||||
'Hits',
|
||||
'Last time'
|
||||
'Last time',
|
||||
]
|
||||
|
||||
pages.append(get_page(query, cols, title))
|
||||
|
@ -936,7 +936,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
|||
'Realm',
|
||||
'Client',
|
||||
'Hits',
|
||||
'Last time'
|
||||
'Last time',
|
||||
]
|
||||
|
||||
pages.append(get_page(query, cols, title))
|
||||
|
@ -974,7 +974,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]:
|
|||
'Client',
|
||||
'Realm',
|
||||
'Hits',
|
||||
'Last time'
|
||||
'Last time',
|
||||
]
|
||||
|
||||
pages.append(get_page(query, cols, title))
|
||||
|
@ -1184,7 +1184,7 @@ def get_user_activity_records_for_realm(realm: str, is_bot: bool) -> QuerySet:
|
|||
records = UserActivity.objects.filter(
|
||||
user_profile__realm__string_id=realm,
|
||||
user_profile__is_active=True,
|
||||
user_profile__is_bot=is_bot
|
||||
user_profile__is_bot=is_bot,
|
||||
)
|
||||
records = records.order_by("user_profile__delivery_email", "-last_visit")
|
||||
records = records.select_related('user_profile', 'client').only(*fields)
|
||||
|
@ -1196,11 +1196,11 @@ def get_user_activity_records_for_email(email: str) -> List[QuerySet]:
|
|||
'query',
|
||||
'client__name',
|
||||
'count',
|
||||
'last_visit'
|
||||
'last_visit',
|
||||
]
|
||||
|
||||
records = UserActivity.objects.filter(
|
||||
user_profile__delivery_email=email
|
||||
user_profile__delivery_email=email,
|
||||
)
|
||||
records = records.order_by("-last_visit")
|
||||
records = records.select_related('user_profile', 'client').only(*fields)
|
||||
|
@ -1211,7 +1211,7 @@ def raw_user_activity_table(records: List[QuerySet]) -> str:
|
|||
'query',
|
||||
'client',
|
||||
'count',
|
||||
'last_visit'
|
||||
'last_visit',
|
||||
]
|
||||
|
||||
def row(record: QuerySet) -> List[Any]:
|
||||
|
@ -1219,7 +1219,7 @@ def raw_user_activity_table(records: List[QuerySet]) -> str:
|
|||
record.query,
|
||||
record.client.name,
|
||||
record.count,
|
||||
format_date_for_activity_reports(record.last_visit)
|
||||
format_date_for_activity_reports(record.last_visit),
|
||||
]
|
||||
|
||||
rows = list(map(row, records))
|
||||
|
@ -1238,13 +1238,13 @@ def get_user_activity_summary(records: List[QuerySet]) -> Dict[str, Dict[str, An
|
|||
if action not in summary:
|
||||
summary[action] = dict(
|
||||
count=record.count,
|
||||
last_visit=record.last_visit
|
||||
last_visit=record.last_visit,
|
||||
)
|
||||
else:
|
||||
summary[action]['count'] += record.count
|
||||
summary[action]['last_visit'] = max(
|
||||
summary[action]['last_visit'],
|
||||
record.last_visit
|
||||
record.last_visit,
|
||||
)
|
||||
|
||||
if records:
|
||||
|
|
|
@ -245,14 +245,14 @@ class StripeTestCase(ZulipTestCase):
|
|||
# sanity check our 8 expected users are active
|
||||
self.assertEqual(
|
||||
UserProfile.objects.filter(realm=realm, is_active=True).count(),
|
||||
8
|
||||
8,
|
||||
)
|
||||
|
||||
# Make sure we have active users outside our realm (to make
|
||||
# sure relevant queries restrict on realm).
|
||||
self.assertEqual(
|
||||
UserProfile.objects.exclude(realm=realm).filter(is_active=True).count(),
|
||||
10
|
||||
10,
|
||||
)
|
||||
|
||||
# Our seat count excludes our guest user and bot, and
|
||||
|
@ -633,14 +633,14 @@ class StripeTest(StripeTestCase):
|
|||
update_license_ledger_if_needed(realm, self.now)
|
||||
self.assertEqual(
|
||||
LicenseLedger.objects.order_by('-id').values_list('licenses', 'licenses_at_next_renewal').first(),
|
||||
(12, 12)
|
||||
(12, 12),
|
||||
)
|
||||
|
||||
with patch('corporate.lib.stripe.get_latest_seat_count', return_value=15):
|
||||
update_license_ledger_if_needed(realm, self.next_month)
|
||||
self.assertEqual(
|
||||
LicenseLedger.objects.order_by('-id').values_list('licenses', 'licenses_at_next_renewal').first(),
|
||||
(15, 15)
|
||||
(15, 15),
|
||||
)
|
||||
|
||||
invoice_plans_as_needed(self.next_month)
|
||||
|
@ -662,7 +662,7 @@ class StripeTest(StripeTestCase):
|
|||
"amount_due": 15 * 80 * 100, "amount_paid": 0, "amount_remaining": 15 * 80 * 100,
|
||||
"auto_advance": True, "billing": "charge_automatically", "collection_method": "charge_automatically",
|
||||
"customer_email": self.example_email("hamlet"), "discount": None, "paid": False, "status": "open",
|
||||
"total": 15 * 80 * 100
|
||||
"total": 15 * 80 * 100,
|
||||
}
|
||||
for key, value in invoice_params.items():
|
||||
self.assertEqual(invoices[0].get(key), value)
|
||||
|
@ -673,7 +673,7 @@ class StripeTest(StripeTestCase):
|
|||
"plan": None, "quantity": 15, "subscription": None, "discountable": False,
|
||||
"period": {
|
||||
"start": datetime_to_timestamp(free_trial_end_date),
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12))
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12)),
|
||||
},
|
||||
}
|
||||
for key, value in invoice_item_params.items():
|
||||
|
@ -687,14 +687,14 @@ class StripeTest(StripeTestCase):
|
|||
update_license_ledger_if_needed(realm, add_months(free_trial_end_date, 10))
|
||||
self.assertEqual(
|
||||
LicenseLedger.objects.order_by('-id').values_list('licenses', 'licenses_at_next_renewal').first(),
|
||||
(19, 19)
|
||||
(19, 19),
|
||||
)
|
||||
invoice_plans_as_needed(add_months(free_trial_end_date, 10))
|
||||
invoices = [invoice for invoice in stripe.Invoice.list(customer=stripe_customer.id)]
|
||||
self.assertEqual(len(invoices), 2)
|
||||
invoice_params = {
|
||||
"amount_due": 5172, "auto_advance": True, "billing": "charge_automatically",
|
||||
"collection_method": "charge_automatically", "customer_email": "hamlet@zulip.com"
|
||||
"collection_method": "charge_automatically", "customer_email": "hamlet@zulip.com",
|
||||
}
|
||||
invoice_items = [invoice_item for invoice_item in invoices[0].get("lines")]
|
||||
self.assertEqual(len(invoice_items), 1)
|
||||
|
@ -703,8 +703,8 @@ class StripeTest(StripeTestCase):
|
|||
"discountable": False, "quantity": 4,
|
||||
"period": {
|
||||
"start": datetime_to_timestamp(add_months(free_trial_end_date, 10)),
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12))
|
||||
}
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12)),
|
||||
},
|
||||
}
|
||||
|
||||
invoice_plans_as_needed(add_months(free_trial_end_date, 12))
|
||||
|
@ -774,7 +774,7 @@ class StripeTest(StripeTestCase):
|
|||
'Zulip Standard', 'Free Trial', str(self.seat_count),
|
||||
'You are using', f'{self.seat_count} of {123} licenses',
|
||||
'Your plan will be upgraded to', 'March 2, 2012',
|
||||
f'{80 * 123:,.2f}', 'Billed by invoice'
|
||||
f'{80 * 123:,.2f}', 'Billed by invoice',
|
||||
]:
|
||||
self.assert_in_response(substring, response)
|
||||
|
||||
|
@ -798,7 +798,7 @@ class StripeTest(StripeTestCase):
|
|||
"amount_due": 123 * 80 * 100, "amount_paid": 0, "amount_remaining": 123 * 80 * 100,
|
||||
"auto_advance": True, "billing": "send_invoice", "collection_method": "send_invoice",
|
||||
"customer_email": self.example_email("hamlet"), "discount": None, "paid": False, "status": "open",
|
||||
"total": 123 * 80 * 100
|
||||
"total": 123 * 80 * 100,
|
||||
}
|
||||
for key, value in invoice_params.items():
|
||||
self.assertEqual(invoices[0].get(key), value)
|
||||
|
@ -809,7 +809,7 @@ class StripeTest(StripeTestCase):
|
|||
"plan": None, "quantity": 123, "subscription": None, "discountable": False,
|
||||
"period": {
|
||||
"start": datetime_to_timestamp(free_trial_end_date),
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12))
|
||||
"end": datetime_to_timestamp(add_months(free_trial_end_date, 12)),
|
||||
},
|
||||
}
|
||||
for key, value in invoice_item_params.items():
|
||||
|
|
|
@ -266,7 +266,7 @@ latex_documents = [
|
|||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'zulip-contributor-docs', 'Zulip Documentation',
|
||||
[author], 1)
|
||||
[author], 1),
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
|
|
|
@ -24,5 +24,5 @@ class Migration(migrations.Migration):
|
|||
|
||||
operations = [
|
||||
migrations.RunPython(rebuild_pgroonga_index,
|
||||
reverse_code=migrations.RunPython.noop)
|
||||
reverse_code=migrations.RunPython.noop),
|
||||
]
|
||||
|
|
|
@ -32,5 +32,5 @@ DROP INDEX zerver_message_search_pgroonga;
|
|||
|
||||
CREATE INDEX CONCURRENTLY zerver_message_search_pgroonga ON zerver_message
|
||||
USING pgroonga(search_pgroonga pgroonga.text_full_text_search_ops);
|
||||
"""])
|
||||
"""]),
|
||||
]
|
||||
|
|
|
@ -82,7 +82,7 @@ states = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, timestamp: Any = None, msg: Optional[str] = None) -> None:
|
||||
|
|
|
@ -14,7 +14,7 @@ states = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, msg: str) -> "NoReturn":
|
||||
|
|
|
@ -18,7 +18,7 @@ states = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, num: str) -> None:
|
||||
|
|
|
@ -9,7 +9,7 @@ states = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, msg: str) -> None:
|
||||
|
|
|
@ -18,7 +18,7 @@ states: Dict[str, int] = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, output: str) -> None:
|
||||
|
|
|
@ -32,7 +32,7 @@ states: Dict[str, int] = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, short_msg: str, too_old: Optional[Set[Any]] = None) -> None:
|
||||
|
@ -40,8 +40,8 @@ def report(state: str, short_msg: str, too_old: Optional[Set[Any]] = None) -> No
|
|||
if too_old:
|
||||
too_old_data = "\nLast call to get_message for recently out of date mirrors:\n" + "\n".join(
|
||||
["{:>16}: {}".format(user.user_profile.email,
|
||||
user.last_visit.strftime("%Y-%m-%d %H:%M %Z")
|
||||
) for user in too_old]
|
||||
user.last_visit.strftime("%Y-%m-%d %H:%M %Z"),
|
||||
) for user in too_old],
|
||||
)
|
||||
print(f"{state}: {short_msg}{too_old_data}")
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ states: Dict[str, int] = {
|
|||
"OK": 0,
|
||||
"WARNING": 1,
|
||||
"CRITICAL": 2,
|
||||
"UNKNOWN": 3
|
||||
"UNKNOWN": 3,
|
||||
}
|
||||
|
||||
def report(state: str, data: str, last_check: float) -> None:
|
||||
|
|
|
@ -36,7 +36,7 @@ states = {
|
|||
0: "OK",
|
||||
1: "WARNING",
|
||||
2: "CRITICAL",
|
||||
3: "UNKNOWN"
|
||||
3: "UNKNOWN",
|
||||
}
|
||||
|
||||
MAX_SECONDS_TO_CLEAR_FOR_BURSTS: DefaultDict[str, int] = defaultdict(
|
||||
|
|
|
@ -10,7 +10,7 @@ if ZULIP_PATH not in sys.path:
|
|||
|
||||
from scripts.lib.zulip_tools import os_families, overwrite_symlink, run, parse_os_release
|
||||
from scripts.lib.setup_venv import (
|
||||
setup_virtualenv, get_venv_dependencies
|
||||
setup_virtualenv, get_venv_dependencies,
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(description="Create a production virtualenv with caching")
|
||||
|
|
|
@ -10,7 +10,7 @@ if ZULIP_PATH not in sys.path:
|
|||
|
||||
from scripts.lib.zulip_tools import os_families, run, parse_os_release
|
||||
from scripts.lib.setup_venv import (
|
||||
setup_virtualenv, THUMBOR_VENV_DEPENDENCIES, YUM_THUMBOR_VENV_DEPENDENCIES
|
||||
setup_virtualenv, THUMBOR_VENV_DEPENDENCIES, YUM_THUMBOR_VENV_DEPENDENCIES,
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(description="Create a thumbor virtualenv with caching")
|
||||
|
|
|
@ -94,7 +94,7 @@ def process_response_error(e: HTTPError) -> None:
|
|||
|
||||
|
||||
def send_email_mirror(
|
||||
rcpt_to: str, shared_secret: str, host: str, url: str, test: bool, verify_ssl: bool
|
||||
rcpt_to: str, shared_secret: str, host: str, url: str, test: bool, verify_ssl: bool,
|
||||
) -> None:
|
||||
if not rcpt_to:
|
||||
print("5.1.1 Bad destination mailbox address: No missed message email address.")
|
||||
|
@ -112,7 +112,7 @@ def send_email_mirror(
|
|||
|
||||
request_data = {
|
||||
"recipient": rcpt_to,
|
||||
"msg_text": msg_text
|
||||
"msg_text": msg_text,
|
||||
}
|
||||
if test:
|
||||
exit(0)
|
||||
|
|
|
@ -23,7 +23,7 @@ def get_yarn_args(production: bool) -> List[str]:
|
|||
return yarn_args
|
||||
|
||||
def generate_sha1sum_node_modules(
|
||||
setup_dir: Optional[str] = None, production: bool = DEFAULT_PRODUCTION
|
||||
setup_dir: Optional[str] = None, production: bool = DEFAULT_PRODUCTION,
|
||||
) -> str:
|
||||
if setup_dir is None:
|
||||
setup_dir = os.path.realpath(os.getcwd())
|
||||
|
@ -69,7 +69,7 @@ def setup_node_modules(
|
|||
def do_yarn_install(
|
||||
target_path: str,
|
||||
yarn_args: List[str],
|
||||
success_stamp: str
|
||||
success_stamp: str,
|
||||
) -> None:
|
||||
os.makedirs(target_path, exist_ok=True)
|
||||
shutil.copy('package.json', target_path)
|
||||
|
|
|
@ -98,9 +98,9 @@ YUM_THUMBOR_VENV_DEPENDENCIES = [
|
|||
|
||||
def get_venv_dependencies(vendor: str, os_version: str) -> List[str]:
|
||||
if vendor == 'ubuntu' and os_version == '20.04':
|
||||
return VENV_DEPENDENCIES + [PYTHON_DEV_DEPENDENCY.format("2"), ]
|
||||
return VENV_DEPENDENCIES + [PYTHON_DEV_DEPENDENCY.format("2")]
|
||||
elif "debian" in os_families():
|
||||
return VENV_DEPENDENCIES + [PYTHON_DEV_DEPENDENCY.format(""), ]
|
||||
return VENV_DEPENDENCIES + [PYTHON_DEV_DEPENDENCY.format("")]
|
||||
elif "rhel" in os_families():
|
||||
return REDHAT_VENV_DEPENDENCIES
|
||||
elif "fedora" in os_families():
|
||||
|
@ -238,7 +238,7 @@ def get_logfile_name(venv_path: str) -> str:
|
|||
return "{}/setup-venv.log".format(venv_path)
|
||||
|
||||
def create_log_entry(
|
||||
target_log: str, parent: str, copied_packages: Set[str], new_packages: Set[str]
|
||||
target_log: str, parent: str, copied_packages: Set[str], new_packages: Set[str],
|
||||
) -> None:
|
||||
|
||||
venv_path = os.path.dirname(target_log)
|
||||
|
|
|
@ -84,7 +84,7 @@ def parse_cache_script_args(description: str) -> argparse.Namespace:
|
|||
|
||||
def get_deploy_root() -> str:
|
||||
return os.path.realpath(
|
||||
os.path.normpath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
||||
os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..")),
|
||||
)
|
||||
|
||||
def get_deployment_version(extract_path: str) -> str:
|
||||
|
@ -271,7 +271,7 @@ def get_caches_to_be_purged(caches_dir: str, caches_in_use: Set[str], threshold_
|
|||
return caches_to_purge
|
||||
|
||||
def purge_unused_caches(
|
||||
caches_dir: str, caches_in_use: Set[str], cache_type: str, args: argparse.Namespace
|
||||
caches_dir: str, caches_in_use: Set[str], cache_type: str, args: argparse.Namespace,
|
||||
) -> None:
|
||||
all_caches = {os.path.join(caches_dir, cache) for cache in os.listdir(caches_dir)}
|
||||
caches_to_purge = get_caches_to_be_purged(caches_dir, caches_in_use, args.threshold_days)
|
||||
|
|
|
@ -17,7 +17,7 @@ states = {
|
|||
0: "OK",
|
||||
1: "WARNING",
|
||||
2: "CRITICAL",
|
||||
3: "UNKNOWN"
|
||||
3: "UNKNOWN",
|
||||
}
|
||||
|
||||
if 'USER' in os.environ and not os.environ['USER'] in ['root', 'rabbitmq']:
|
||||
|
|
|
@ -18,5 +18,5 @@ pylibmc.Client(
|
|||
binary=True,
|
||||
username=settings.MEMCACHED_USERNAME,
|
||||
password=settings.MEMCACHED_PASSWORD,
|
||||
behaviors=settings.CACHES["default"]["OPTIONS"] # type: ignore[index] # settings not typed properly
|
||||
behaviors=settings.CACHES["default"]["OPTIONS"], # type: ignore[index] # settings not typed properly
|
||||
).flush_all()
|
||||
|
|
|
@ -149,7 +149,7 @@ def generate_secrets(development: bool = False) -> None:
|
|||
with open(filename, "a") as f:
|
||||
f.write(
|
||||
"# Set a Redis password based on zulip-secrets.conf\n"
|
||||
"requirepass '%s'\n" % (redis_password,)
|
||||
"requirepass '%s'\n" % (redis_password,),
|
||||
)
|
||||
break
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ def restore_backup(tarball_file: IO[bytes]) -> None:
|
|||
assert not any("|" in name or "|" in path for name, path in paths)
|
||||
transform_args = [
|
||||
r"--transform=s|^zulip-backup/{}(/.*)?$|{}\1|x".format(
|
||||
re.escape(name), path.replace("\\", r"\\")
|
||||
re.escape(name), path.replace("\\", r"\\"),
|
||||
)
|
||||
for name, path in paths
|
||||
]
|
||||
|
@ -89,12 +89,12 @@ def restore_backup(tarball_file: IO[bytes]) -> None:
|
|||
run(
|
||||
[
|
||||
os.path.join(
|
||||
settings.DEPLOY_ROOT, "scripts", "setup", "terminate-psql-sessions"
|
||||
settings.DEPLOY_ROOT, "scripts", "setup", "terminate-psql-sessions",
|
||||
),
|
||||
"zulip",
|
||||
"zulip",
|
||||
"zulip_base",
|
||||
]
|
||||
],
|
||||
)
|
||||
as_postgres = ["su", "-s", "/usr/bin/env", "-", "--", POSTGRES_USER]
|
||||
run(as_postgres + ["dropdb", "--if-exists", "--", db_name])
|
||||
|
@ -130,7 +130,7 @@ def restore_backup(tarball_file: IO[bytes]) -> None:
|
|||
[
|
||||
os.path.join(settings.DEPLOY_ROOT, "scripts", "zulip-puppet-apply"),
|
||||
"-f",
|
||||
]
|
||||
],
|
||||
)
|
||||
|
||||
# Now, restore the the database backup using pg_restore. This
|
||||
|
|
|
@ -12,7 +12,7 @@ def get_start_url() -> List[str]:
|
|||
start_file = os.path.join(dir_path, os.path.join(*[os.pardir] * 4),
|
||||
"docs/_build/html/index.html")
|
||||
return [
|
||||
pathlib.Path(os.path.abspath(start_file)).as_uri()
|
||||
pathlib.Path(os.path.abspath(start_file)).as_uri(),
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -236,5 +236,5 @@ else:
|
|||
parser.error(
|
||||
"Could not find configuration for integration. "
|
||||
"You can specify a fixture file to use, using the --fixture flag. "
|
||||
"Or add a configuration to zerver.lib.integrations.DOC_SCREENSHOT_CONFIG"
|
||||
"Or add a configuration to zerver.lib.integrations.DOC_SCREENSHOT_CONFIG",
|
||||
)
|
||||
|
|
|
@ -69,7 +69,7 @@ WORD_SET = {
|
|||
'testing', 'tested', # 'tests' excluded to reduce false negative
|
||||
'truncates', 'truncating', 'truncated',
|
||||
'updates', 'updating', 'updated',
|
||||
'uses', 'using', 'used'
|
||||
'uses', 'using', 'used',
|
||||
}
|
||||
|
||||
imperative_forms = sorted([
|
||||
|
@ -135,7 +135,7 @@ class ImperativeMood(LineRule):
|
|||
violation = RuleViolation(self.id, self.error_msg.format(
|
||||
word=first_word,
|
||||
imperative=imperative,
|
||||
title=commit.message.title
|
||||
title=commit.message.title,
|
||||
))
|
||||
|
||||
violations.append(violation)
|
||||
|
|
|
@ -85,7 +85,7 @@ def pretty_print_html(html: str, num_spaces: int = 4) -> str:
|
|||
adjustment=adjustment,
|
||||
indenting=True,
|
||||
adjust_offset_until=token.line,
|
||||
ignore_lines=[]
|
||||
ignore_lines=[],
|
||||
)
|
||||
if token.kind in ('handlebars_start', 'django_start'):
|
||||
info.update(dict(depth=new_depth - 1, indenting=False))
|
||||
|
@ -98,7 +98,7 @@ def pretty_print_html(html: str, num_spaces: int = 4) -> str:
|
|||
tag=token.tag,
|
||||
token_kind=token.kind,
|
||||
extra_indent=stack[-1]['extra_indent'],
|
||||
ignore_lines=[]
|
||||
ignore_lines=[],
|
||||
)
|
||||
stack.append(info)
|
||||
elif (token.kind in ('html_end', 'handlebars_end', 'html_singleton_end',
|
||||
|
|
|
@ -55,7 +55,7 @@ try:
|
|||
os.remove(os.path.join(VAR_DIR_PATH, 'zulip-test-symlink'))
|
||||
os.symlink(
|
||||
os.path.join(ZULIP_PATH, 'README.md'),
|
||||
os.path.join(VAR_DIR_PATH, 'zulip-test-symlink')
|
||||
os.path.join(VAR_DIR_PATH, 'zulip-test-symlink'),
|
||||
)
|
||||
os.remove(os.path.join(VAR_DIR_PATH, 'zulip-test-symlink'))
|
||||
except OSError:
|
||||
|
@ -130,7 +130,7 @@ COMMON_DEPENDENCIES = [
|
|||
"libxss1",
|
||||
"fonts-freefont-ttf",
|
||||
"libappindicator1",
|
||||
"xdg-utils"
|
||||
"xdg-utils",
|
||||
# Puppeteer dependencies end here.
|
||||
]
|
||||
|
||||
|
@ -152,7 +152,7 @@ COMMON_YUM_DEPENDENCIES = COMMON_DEPENDENCIES + [
|
|||
"freetype",
|
||||
"freetype-devel",
|
||||
"fontconfig-devel",
|
||||
"libstdc++"
|
||||
"libstdc++",
|
||||
] + YUM_THUMBOR_VENV_DEPENDENCIES
|
||||
|
||||
BUILD_PGROONGA_FROM_SOURCE = False
|
||||
|
@ -168,7 +168,7 @@ if vendor == 'debian' and os_version in [] or vendor == 'ubuntu' and os_version
|
|||
"libgroonga-dev",
|
||||
"libmsgpack-dev",
|
||||
"clang-9",
|
||||
"llvm-9-dev"
|
||||
"llvm-9-dev",
|
||||
]
|
||||
] + VENV_DEPENDENCIES
|
||||
elif "debian" in os_families():
|
||||
|
@ -244,7 +244,7 @@ def install_apt_deps(deps_to_install: List[str]) -> None:
|
|||
"env", "DEBIAN_FRONTEND=noninteractive",
|
||||
"apt-get", "-y", "install", "--no-install-recommends",
|
||||
]
|
||||
+ deps_to_install
|
||||
+ deps_to_install,
|
||||
)
|
||||
|
||||
def install_yum_deps(deps_to_install: List[str]) -> None:
|
||||
|
@ -411,7 +411,7 @@ def main(options: argparse.Namespace) -> "NoReturn":
|
|||
provision_inner,
|
||||
*(["--force"] if options.is_force else []),
|
||||
*(["--build-release-tarball-only"] if options.is_build_release_tarball_only else []),
|
||||
]
|
||||
],
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -128,7 +128,7 @@ def need_to_run_build_pygments_data() -> bool:
|
|||
return is_digest_obsolete(
|
||||
"build_pygments_data_hash",
|
||||
build_pygments_data_paths(),
|
||||
[pygments_version]
|
||||
[pygments_version],
|
||||
)
|
||||
|
||||
def need_to_run_compilemessages() -> bool:
|
||||
|
@ -155,7 +155,7 @@ def need_to_run_configure_rabbitmq(settings_list: List[str]) -> bool:
|
|||
obsolete = is_digest_obsolete(
|
||||
'last_configure_rabbitmq_hash',
|
||||
configure_rabbitmq_paths(),
|
||||
settings_list
|
||||
settings_list,
|
||||
)
|
||||
|
||||
if obsolete:
|
||||
|
@ -204,7 +204,7 @@ def main(options: argparse.Namespace) -> int:
|
|||
write_new_digest(
|
||||
'build_pygments_data_hash',
|
||||
build_pygments_data_paths(),
|
||||
[pygments_version]
|
||||
[pygments_version],
|
||||
)
|
||||
else:
|
||||
print("No need to run `tools/setup/build_pygments_data`.")
|
||||
|
@ -240,7 +240,7 @@ def main(options: argparse.Namespace) -> int:
|
|||
write_new_digest(
|
||||
'last_configure_rabbitmq_hash',
|
||||
configure_rabbitmq_paths(),
|
||||
[settings.RABBITMQ_PASSWORD]
|
||||
[settings.RABBITMQ_PASSWORD],
|
||||
)
|
||||
else:
|
||||
print("No need to run `scripts/setup/configure-rabbitmq.")
|
||||
|
|
|
@ -160,8 +160,8 @@ def tokenize(text: str) -> List[Token]:
|
|||
e.message,
|
||||
state.line,
|
||||
state.col,
|
||||
e.line_content
|
||||
)
|
||||
e.line_content,
|
||||
),
|
||||
)
|
||||
|
||||
line_span = len(s.split('\n'))
|
||||
|
@ -171,7 +171,7 @@ def tokenize(text: str) -> List[Token]:
|
|||
tag=tag.strip(),
|
||||
line=state.line,
|
||||
col=state.col,
|
||||
line_span=line_span
|
||||
line_span=line_span,
|
||||
)
|
||||
tokens.append(token)
|
||||
advance(len(s))
|
||||
|
@ -183,7 +183,7 @@ def tokenize(text: str) -> List[Token]:
|
|||
tag=tag,
|
||||
line=state.line,
|
||||
col=state.col,
|
||||
line_span=1
|
||||
line_span=1,
|
||||
)
|
||||
tokens.append(token)
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ def server_is_up(server: "subprocess.Popen[bytes]", log_file: Optional[str]) ->
|
|||
|
||||
@contextmanager
|
||||
def test_server_running(force: bool=False, external_host: str='testserver',
|
||||
log_file: Optional[str]=None, dots: bool=False, use_db: bool=True
|
||||
log_file: Optional[str]=None, dots: bool=False, use_db: bool=True,
|
||||
) -> Iterator[None]:
|
||||
log = sys.stdout
|
||||
if log_file:
|
||||
|
|
|
@ -60,13 +60,13 @@ shebang_rules: List["Rule"] = [
|
|||
'description': "Use `#!/usr/bin/env foo` instead of `#!/path/foo`"
|
||||
" for interpreters other than sh."},
|
||||
{'pattern': '^#!/usr/bin/env python$',
|
||||
'description': "Use `#!/usr/bin/env python3` instead of `#!/usr/bin/env python`."}
|
||||
'description': "Use `#!/usr/bin/env python3` instead of `#!/usr/bin/env python`."},
|
||||
]
|
||||
|
||||
trailing_whitespace_rule: "Rule" = {
|
||||
'pattern': r'\s+$',
|
||||
'strip': '\n',
|
||||
'description': 'Fix trailing whitespace'
|
||||
'description': 'Fix trailing whitespace',
|
||||
}
|
||||
whitespace_rules: List["Rule"] = [
|
||||
# This linter should be first since bash_rules depends on it.
|
||||
|
@ -446,8 +446,8 @@ bash_rules = RuleList(
|
|||
'include_only': {'scripts/'},
|
||||
'exclude': {
|
||||
'scripts/lib/install',
|
||||
'scripts/setup/configure-rabbitmq'
|
||||
}, },
|
||||
'scripts/setup/configure-rabbitmq',
|
||||
}},
|
||||
*whitespace_rules[0:1],
|
||||
],
|
||||
shebang_rules=shebang_rules,
|
||||
|
@ -554,7 +554,7 @@ html_rules: List["Rule"] = whitespace_rules + prose_style_rules + [
|
|||
{'pattern': r'title="[^{\:]',
|
||||
'exclude_line': {
|
||||
('templates/zerver/app/markdown_help.html',
|
||||
'<td class="rendered_markdown"><img alt=":heart:" class="emoji" src="/static/generated/emoji/images/emoji/heart.png" title=":heart:" /></td>')
|
||||
'<td class="rendered_markdown"><img alt=":heart:" class="emoji" src="/static/generated/emoji/images/emoji/heart.png" title=":heart:" /></td>'),
|
||||
},
|
||||
'exclude': {"templates/zerver/emails", "templates/analytics/realm_details.html", "templates/analytics/support.html"},
|
||||
'description': "`title` value should be translatable."},
|
||||
|
@ -691,7 +691,7 @@ json_rules = RuleList(
|
|||
{'pattern': r'":["\[\{]',
|
||||
'exclude': {'zerver/webhooks/', 'zerver/tests/fixtures/'},
|
||||
'description': 'Require space after : in JSON'},
|
||||
]
|
||||
],
|
||||
)
|
||||
|
||||
markdown_docs_length_exclude = {
|
||||
|
@ -737,7 +737,7 @@ markdown_rules = RuleList(
|
|||
],
|
||||
max_length=120,
|
||||
length_exclude=markdown_docs_length_exclude,
|
||||
exclude_files_in='templates/zerver/help/'
|
||||
exclude_files_in='templates/zerver/help/',
|
||||
)
|
||||
|
||||
help_markdown_rules = RuleList(
|
||||
|
|
|
@ -203,7 +203,7 @@ def fetch_request(url: str, callback: Any, **kwargs: Any) -> "Generator[Callable
|
|||
connect_timeout=240.0,
|
||||
request_timeout=240.0,
|
||||
decompress_response=False,
|
||||
**kwargs
|
||||
**kwargs,
|
||||
)
|
||||
client = httpclient.AsyncHTTPClient()
|
||||
# wait for response
|
||||
|
@ -218,7 +218,7 @@ class BaseHandler(web.RequestHandler):
|
|||
target_port: int
|
||||
|
||||
def _add_request_headers(
|
||||
self, exclude_lower_headers_list: Optional[List[str]] = None
|
||||
self, exclude_lower_headers_list: Optional[List[str]] = None,
|
||||
) -> httputil.HTTPHeaders:
|
||||
exclude_lower_headers_list = exclude_lower_headers_list or []
|
||||
headers = httputil.HTTPHeaders()
|
||||
|
@ -284,7 +284,7 @@ class BaseHandler(web.RequestHandler):
|
|||
headers=self._add_request_headers(["upgrade-insecure-requests"]),
|
||||
follow_redirects=False,
|
||||
body=getattr(self.request, 'body'),
|
||||
allow_nonstandard_methods=True
|
||||
allow_nonstandard_methods=True,
|
||||
)
|
||||
except httpclient.HTTPError as e:
|
||||
if hasattr(e, 'response') and e.response:
|
||||
|
@ -329,7 +329,7 @@ class Application(web.Application):
|
|||
(r"/api/v1/events.*", TornadoHandler),
|
||||
(r"/webpack.*", WebPackHandler),
|
||||
(r"/thumbor.*", ThumborHandler if using_thumbor() else ErrorHandler),
|
||||
(r"/.*", DjangoHandler)
|
||||
(r"/.*", DjangoHandler),
|
||||
]
|
||||
super().__init__(handlers, enable_logging=enable_logging)
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ def main() -> None:
|
|||
|
||||
args = parser.parse_args()
|
||||
prepare_sorting_info()
|
||||
output_data = [column_names, ]
|
||||
output_data = [column_names]
|
||||
explanation_lines: List[str] = []
|
||||
with open(args.input_file_path) as fp:
|
||||
for line in fp.readlines():
|
||||
|
|
|
@ -132,7 +132,7 @@ def generate_emoji_code_to_emoji_names_maps() -> None:
|
|||
if emoji_code in reverse_unified_reactions_map:
|
||||
reverse_unified_reactions_map[emoji_code].append(name)
|
||||
else:
|
||||
reverse_unified_reactions_map[emoji_code] = [name, ]
|
||||
reverse_unified_reactions_map[emoji_code] = [name]
|
||||
|
||||
for emoji_code in reverse_unified_reactions_map:
|
||||
emoji_code_to_gemoji_names[emoji_code] = ", ".join(reverse_unified_reactions_map[emoji_code])
|
||||
|
@ -146,7 +146,7 @@ def generate_emoji_code_to_emoji_names_maps() -> None:
|
|||
for emoji_code in EMOJI_NAME_MAPS:
|
||||
canonical_name = EMOJI_NAME_MAPS[emoji_code]["canonical_name"]
|
||||
aliases = EMOJI_NAME_MAPS[emoji_code]["aliases"]
|
||||
names = [canonical_name, ]
|
||||
names = [canonical_name]
|
||||
names.extend(aliases)
|
||||
emoji_code_to_zulip_names[emoji_code] = ", ".join(names)
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ def check_valid_emoji_name(emoji_name: str) -> None:
|
|||
def check_emoji_names(canonical_name: str, aliases: List[str]) -> None:
|
||||
if canonical_name == 'X':
|
||||
return
|
||||
names_to_check = [canonical_name, ] + aliases
|
||||
names_to_check = [canonical_name] + aliases
|
||||
for name in names_to_check:
|
||||
check_valid_emoji_name(name)
|
||||
check_uniqueness(name)
|
||||
|
|
|
@ -51,7 +51,7 @@ with test_server_running(force=options.force, external_host='zulipdev.com:9981')
|
|||
client = Client(
|
||||
email=email,
|
||||
api_key=api_key,
|
||||
site=site
|
||||
site=site,
|
||||
)
|
||||
|
||||
# Prepare a generic bot client for curl testing
|
||||
|
@ -62,7 +62,7 @@ with test_server_running(force=options.force, external_host='zulipdev.com:9981')
|
|||
bot_client = Client(
|
||||
email=email,
|
||||
api_key=api_key,
|
||||
site=site
|
||||
site=site,
|
||||
)
|
||||
|
||||
# Prepare the non-admin client
|
||||
|
@ -73,7 +73,7 @@ with test_server_running(force=options.force, external_host='zulipdev.com:9981')
|
|||
nonadmin_client = Client(
|
||||
email=email,
|
||||
api_key=api_key,
|
||||
site=site
|
||||
site=site,
|
||||
)
|
||||
|
||||
test_the_api(client, nonadmin_client)
|
||||
|
@ -84,7 +84,7 @@ with test_server_running(force=options.force, external_host='zulipdev.com:9981')
|
|||
client = Client(
|
||||
email=email,
|
||||
api_key='X'*32,
|
||||
site=site
|
||||
site=site,
|
||||
)
|
||||
test_invalid_api_key(client)
|
||||
|
||||
|
|
|
@ -279,7 +279,7 @@ def enforce_proper_coverage(coverage_json: Any) -> bool:
|
|||
glob.glob('static/js/*.ts') +
|
||||
glob.glob('static/shared/js/*.js') +
|
||||
glob.glob('static/shared/js/*.ts') +
|
||||
glob.glob('static/js/billing/*.js')
|
||||
glob.glob('static/js/billing/*.js'),
|
||||
)
|
||||
enforce_fully_covered = all_js_files - EXEMPT_FILES
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ def build_for_dev_server(host: str, port: str, minify: bool, disable_host_check:
|
|||
# We add the hot flag using the cli because it takes care
|
||||
# of addition to entry points and adding the plugin
|
||||
# automatically
|
||||
'--hot'
|
||||
'--hot',
|
||||
]
|
||||
if minify:
|
||||
webpack_args.append('--optimize-minimize')
|
||||
|
@ -99,7 +99,7 @@ def build_for_most_tests() -> None:
|
|||
entries[entry] = [{
|
||||
"name": f"{entry}.js",
|
||||
"publicPath": f"http://localhost:3000/webpack-stub/{entry}-stubentry.js",
|
||||
"path": f"/stubfolder/{entry}-stubfile.js"
|
||||
"path": f"/stubfolder/{entry}-stubfile.js",
|
||||
}]
|
||||
stat_data = {
|
||||
"status": "done",
|
||||
|
|
|
@ -84,5 +84,5 @@ for msg in result['messages']:
|
|||
filename = f"zulip-{options.stream}.json"
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(json.dumps(messages, indent=0, sort_keys=False).encode('utf-8'))
|
||||
print("%d messages exported to %s" % (len(messages), filename,))
|
||||
print("%d messages exported to %s" % (len(messages), filename))
|
||||
sys.exit(0)
|
||||
|
|
|
@ -188,7 +188,7 @@ def login_context(request: HttpRequest) -> Dict[str, Any]:
|
|||
# by the desktop client. We expand it with IDs of the <button> elements corresponding
|
||||
# to the authentication methods.
|
||||
context['page_params'] = dict(
|
||||
external_authentication_methods = get_external_method_dicts(realm)
|
||||
external_authentication_methods = get_external_method_dicts(realm),
|
||||
)
|
||||
for auth_dict in context['page_params']['external_authentication_methods']:
|
||||
auth_dict['button_id_suffix'] = "auth_button_{}".format(auth_dict['name'])
|
||||
|
|
|
@ -534,7 +534,7 @@ def get_hipchat_sender_id(realm_id: int,
|
|||
return None
|
||||
mirror_user = user_handler.get_mirror_user(
|
||||
realm_id=realm_id,
|
||||
name=message_dict['sender']['name']
|
||||
name=message_dict['sender']['name'],
|
||||
)
|
||||
sender_id = mirror_user['id']
|
||||
return sender_id
|
||||
|
@ -544,7 +544,7 @@ def get_hipchat_sender_id(realm_id: int,
|
|||
return None
|
||||
mirror_user = user_handler.get_mirror_user(
|
||||
realm_id=realm_id,
|
||||
name=message_dict['sender']['id']
|
||||
name=message_dict['sender']['id'],
|
||||
)
|
||||
sender_id = mirror_user['id']
|
||||
return sender_id
|
||||
|
|
|
@ -42,7 +42,7 @@ class AttachmentHandler:
|
|||
target_path = os.path.join(
|
||||
str(realm_id),
|
||||
'HipChatImportAttachment',
|
||||
path
|
||||
path,
|
||||
)
|
||||
|
||||
if target_path in self.info_dict:
|
||||
|
@ -130,7 +130,7 @@ class AttachmentHandler:
|
|||
os.makedirs(os.path.join(uploads_folder, str(realm_id)), exist_ok=True)
|
||||
|
||||
attachment = dict(
|
||||
zerver_attachment=attachments
|
||||
zerver_attachment=attachments,
|
||||
)
|
||||
|
||||
create_converted_data_files(uploads_records, output_dir, '/uploads/records.json')
|
||||
|
|
|
@ -428,7 +428,7 @@ def build_stream(date_created: Any, realm_id: int, name: str,
|
|||
|
||||
def build_huddle(huddle_id: int) -> ZerverFieldsT:
|
||||
huddle = Huddle(
|
||||
id=huddle_id
|
||||
id=huddle_id,
|
||||
)
|
||||
return model_to_dict(huddle)
|
||||
|
||||
|
@ -635,7 +635,7 @@ def build_realm_emoji(realm_id: int,
|
|||
name=name,
|
||||
id=id,
|
||||
file_name=file_name,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
def process_emojis(zerver_realmemoji: List[ZerverFieldsT], emoji_dir: str,
|
||||
|
|
|
@ -430,7 +430,7 @@ def process_posts(num_teams: int,
|
|||
sender_id=sender_id,
|
||||
content=content,
|
||||
date_sent=int(post_dict['create_at'] / 1000),
|
||||
reactions=reactions
|
||||
reactions=reactions,
|
||||
)
|
||||
if "channel" in post_dict:
|
||||
message_dict["channel_name"] = post_dict["channel"]
|
||||
|
|
|
@ -231,8 +231,8 @@ def build_customprofile_field(customprofile_field: List[ZerverFieldsT], fields:
|
|||
customprofilefield = CustomProfileField(
|
||||
id=custom_profile_field_id,
|
||||
name=field_name,
|
||||
field_type=1 # For now this is defaulted to 'SHORT_TEXT'
|
||||
# Processing is done in the function 'process_customprofilefields'
|
||||
field_type=1, # For now this is defaulted to 'SHORT_TEXT'
|
||||
# Processing is done in the function 'process_customprofilefields'
|
||||
)
|
||||
|
||||
customprofilefield_dict = model_to_dict(customprofilefield,
|
||||
|
@ -699,7 +699,7 @@ def channel_message_to_zerver_message(realm_id: int,
|
|||
# Slack's channel join/leave notices are spammy
|
||||
"channel_join",
|
||||
"channel_leave",
|
||||
"channel_name"
|
||||
"channel_name",
|
||||
]:
|
||||
continue
|
||||
|
||||
|
@ -885,7 +885,7 @@ def get_attachment_path_and_content(fileinfo: ZerverFieldsT, realm_id: int) -> T
|
|||
# in sync with 'exports.py' function 'import_message_data'
|
||||
format(random.randint(0, 255), 'x'),
|
||||
random_name(18),
|
||||
sanitize_name(fileinfo['name'])
|
||||
sanitize_name(fileinfo['name']),
|
||||
])
|
||||
attachment_path = f'/user_uploads/{s3_path}'
|
||||
content = '[{}]({})'.format(fileinfo['title'], attachment_path)
|
||||
|
|
|
@ -259,7 +259,7 @@ def access_user_by_api_key(request: HttpRequest, api_key: str, email: Optional[s
|
|||
def log_exception_to_webhook_logger(
|
||||
request: HttpRequest, user_profile: UserProfile,
|
||||
request_body: Optional[str]=None,
|
||||
unexpected_event: Optional[bool]=False
|
||||
unexpected_event: Optional[bool]=False,
|
||||
) -> None:
|
||||
if request_body is not None:
|
||||
payload = request_body
|
||||
|
@ -318,7 +318,7 @@ def full_webhook_client_name(raw_client_name: Optional[str]=None) -> Optional[st
|
|||
# Use this for webhook views that don't get an email passed in.
|
||||
def api_key_only_webhook_view(
|
||||
webhook_client_name: str,
|
||||
notify_bot_owner_on_invalid_json: Optional[bool]=True
|
||||
notify_bot_owner_on_invalid_json: Optional[bool]=True,
|
||||
) -> Callable[[ViewFuncT], ViewFuncT]:
|
||||
# TODO The typing here could be improved by using the Extended Callable types:
|
||||
# https://mypy.readthedocs.io/en/latest/kinds_of_types.html#extended-callable-types
|
||||
|
@ -456,12 +456,12 @@ def zulip_login_required(
|
|||
actual_decorator = user_passes_test(
|
||||
logged_in_and_active,
|
||||
login_url=login_url,
|
||||
redirect_field_name=redirect_field_name
|
||||
redirect_field_name=redirect_field_name,
|
||||
)
|
||||
|
||||
otp_required_decorator = zulip_otp_required(
|
||||
redirect_field_name=redirect_field_name,
|
||||
login_url=login_url
|
||||
login_url=login_url,
|
||||
)
|
||||
|
||||
if function:
|
||||
|
@ -621,7 +621,7 @@ def process_as_post(view_func: ViewFuncT) -> ViewFuncT:
|
|||
request.META,
|
||||
BytesIO(request.body),
|
||||
request.upload_handlers,
|
||||
request.encoding
|
||||
request.encoding,
|
||||
).parse()
|
||||
else:
|
||||
request.POST = QueryDict(request.body, encoding=request.encoding)
|
||||
|
|
|
@ -240,7 +240,7 @@ class ZulipPasswordResetForm(PasswordResetForm):
|
|||
from_email: Optional[str]=None,
|
||||
request: HttpRequest=None,
|
||||
html_email_template_name: Optional[str]=None,
|
||||
extra_email_context: Optional[Dict[str, Any]]=None
|
||||
extra_email_context: Optional[Dict[str, Any]]=None,
|
||||
) -> None:
|
||||
"""
|
||||
If the email address has an account in the target realm,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from typing import (
|
||||
AbstractSet, Any, Callable, Dict, Iterable, List, Mapping, MutableMapping,
|
||||
Optional, Sequence, Set, Tuple, Union, cast
|
||||
Optional, Sequence, Set, Tuple, Union, cast,
|
||||
)
|
||||
from typing_extensions import TypedDict
|
||||
|
||||
|
@ -240,7 +240,7 @@ def bot_owner_user_ids(user_profile: UserProfile) -> Set[int]:
|
|||
user_profile.default_events_register_stream and
|
||||
user_profile.default_events_register_stream.invite_only)
|
||||
if is_private_bot:
|
||||
return {user_profile.bot_owner_id, }
|
||||
return {user_profile.bot_owner_id}
|
||||
else:
|
||||
users = {user.id for user in user_profile.realm.get_human_admin_users()}
|
||||
users.add(user_profile.bot_owner_id)
|
||||
|
@ -282,8 +282,8 @@ def notify_new_user(user_profile: UserProfile) -> None:
|
|||
signup_notifications_stream,
|
||||
"signups",
|
||||
"@_**%s|%s** just signed up for Zulip. (total: %i)" % (
|
||||
user_profile.full_name, user_profile.id, user_count
|
||||
)
|
||||
user_profile.full_name, user_profile.id, user_count,
|
||||
),
|
||||
)
|
||||
|
||||
# We also send a notification to the Zulip administrative realm
|
||||
|
@ -300,7 +300,7 @@ def notify_new_user(user_profile: UserProfile) -> None:
|
|||
user_profile.full_name,
|
||||
user_profile.email,
|
||||
user_count,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
except Stream.DoesNotExist:
|
||||
|
@ -395,7 +395,7 @@ def process_new_human_user(user_profile: UserProfile,
|
|||
user_profile.realm,
|
||||
get_system_bot(settings.NOTIFICATION_BOT),
|
||||
prereg_user.referred_by,
|
||||
f"{user_profile.full_name} <`{user_profile.email}`> accepted your invitation to join Zulip!"
|
||||
f"{user_profile.full_name} <`{user_profile.email}`> accepted your invitation to join Zulip!",
|
||||
)
|
||||
# Mark any other PreregistrationUsers that are STATUS_ACTIVE as
|
||||
# inactive so we can keep track of the PreregistrationUser we
|
||||
|
@ -523,7 +523,7 @@ def do_create_user(email: str, password: Optional[str], realm: Realm, full_name:
|
|||
realm=user_profile.realm, modified_user=user_profile,
|
||||
event_type=RealmAuditLog.USER_CREATED, event_time=event_time,
|
||||
extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm),
|
||||
}))
|
||||
do_increment_logging_stat(user_profile.realm, COUNT_STATS['active_users_log:is_bot:day'],
|
||||
user_profile.is_bot, event_time)
|
||||
|
@ -554,7 +554,7 @@ def do_activate_user(user_profile: UserProfile) -> None:
|
|||
realm=user_profile.realm, modified_user=user_profile,
|
||||
event_type=RealmAuditLog.USER_ACTIVATED, event_time=event_time,
|
||||
extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm),
|
||||
}))
|
||||
do_increment_logging_stat(user_profile.realm, COUNT_STATS['active_users_log:is_bot:day'],
|
||||
user_profile.is_bot, event_time)
|
||||
|
@ -574,7 +574,7 @@ def do_reactivate_user(user_profile: UserProfile, acting_user: Optional[UserProf
|
|||
realm=user_profile.realm, modified_user=user_profile, acting_user=acting_user,
|
||||
event_type=RealmAuditLog.USER_REACTIVATED, event_time=event_time,
|
||||
extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm),
|
||||
}))
|
||||
do_increment_logging_stat(user_profile.realm, COUNT_STATS['active_users_log:is_bot:day'],
|
||||
user_profile.is_bot, event_time)
|
||||
|
@ -638,7 +638,7 @@ def do_set_realm_authentication_methods(realm: Realm,
|
|||
type="realm",
|
||||
op="update_dict",
|
||||
property='default',
|
||||
data=dict(authentication_methods=realm.authentication_methods_dict())
|
||||
data=dict(authentication_methods=realm.authentication_methods_dict()),
|
||||
)
|
||||
send_event(realm, event, active_user_ids(realm.id))
|
||||
|
||||
|
@ -652,7 +652,7 @@ def do_set_realm_message_editing(realm: Realm,
|
|||
realm.save(update_fields=['allow_message_editing',
|
||||
'allow_community_topic_editing',
|
||||
'message_content_edit_limit_seconds',
|
||||
]
|
||||
],
|
||||
)
|
||||
event = dict(
|
||||
type="realm",
|
||||
|
@ -683,7 +683,7 @@ def do_set_realm_notifications_stream(realm: Realm, stream: Stream, stream_id: i
|
|||
type="realm",
|
||||
op="update",
|
||||
property="notifications_stream_id",
|
||||
value=stream_id
|
||||
value=stream_id,
|
||||
)
|
||||
send_event(realm, event, active_user_ids(realm.id))
|
||||
|
||||
|
@ -695,7 +695,7 @@ def do_set_realm_signup_notifications_stream(realm: Realm, stream: Stream,
|
|||
type="realm",
|
||||
op="update",
|
||||
property="signup_notifications_stream_id",
|
||||
value=stream_id
|
||||
value=stream_id,
|
||||
)
|
||||
send_event(realm, event, active_user_ids(realm.id))
|
||||
|
||||
|
@ -719,7 +719,7 @@ def do_deactivate_realm(realm: Realm, acting_user: Optional[UserProfile]=None) -
|
|||
RealmAuditLog.objects.create(
|
||||
realm=realm, event_type=RealmAuditLog.REALM_DEACTIVATED, event_time=event_time,
|
||||
acting_user=acting_user, extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm),
|
||||
}))
|
||||
|
||||
ScheduledEmail.objects.filter(realm=realm).delete()
|
||||
|
@ -741,7 +741,7 @@ def do_reactivate_realm(realm: Realm) -> None:
|
|||
RealmAuditLog.objects.create(
|
||||
realm=realm, event_type=RealmAuditLog.REALM_REACTIVATED, event_time=event_time,
|
||||
extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(realm),
|
||||
}))
|
||||
|
||||
def do_change_realm_subdomain(realm: Realm, new_subdomain: str) -> None:
|
||||
|
@ -790,7 +790,7 @@ def do_deactivate_user(user_profile: UserProfile,
|
|||
realm=user_profile.realm, modified_user=user_profile, acting_user=acting_user,
|
||||
event_type=RealmAuditLog.USER_DEACTIVATED, event_time=event_time,
|
||||
extra_data=ujson.dumps({
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm)
|
||||
RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm),
|
||||
}))
|
||||
do_increment_logging_stat(user_profile.realm, COUNT_STATS['active_users_log:is_bot:day'],
|
||||
user_profile.is_bot, event_time, increment=-1)
|
||||
|
@ -914,7 +914,7 @@ def do_start_email_change_process(user_profile: UserProfile, new_email: str) ->
|
|||
context.update({
|
||||
'old_email': old_email,
|
||||
'new_email': new_email,
|
||||
'activate_url': activation_url
|
||||
'activate_url': activation_url,
|
||||
})
|
||||
language = user_profile.default_language
|
||||
send_email('zerver/emails/confirm_new_email', to_emails=[new_email],
|
||||
|
@ -1117,7 +1117,7 @@ def get_recipient_info(recipient: Recipient,
|
|||
query = query_for_ids(
|
||||
query=query,
|
||||
user_ids=sorted(list(user_ids)),
|
||||
field='id'
|
||||
field='id',
|
||||
)
|
||||
rows = list(query)
|
||||
else:
|
||||
|
@ -1150,16 +1150,16 @@ def get_recipient_info(recipient: Recipient,
|
|||
|
||||
active_user_ids = get_ids_for(lambda r: True)
|
||||
push_notify_user_ids = get_ids_for(
|
||||
lambda r: r['enable_online_push_notifications']
|
||||
lambda r: r['enable_online_push_notifications'],
|
||||
)
|
||||
|
||||
# Service bots don't get UserMessage rows.
|
||||
um_eligible_user_ids = get_ids_for(
|
||||
lambda r: not is_service_bot(r)
|
||||
lambda r: not is_service_bot(r),
|
||||
)
|
||||
|
||||
long_term_idle_user_ids = get_ids_for(
|
||||
lambda r: r['long_term_idle']
|
||||
lambda r: r['long_term_idle'],
|
||||
)
|
||||
|
||||
# These two bot data structures need to filter from the full set
|
||||
|
@ -1193,7 +1193,7 @@ def get_recipient_info(recipient: Recipient,
|
|||
um_eligible_user_ids=um_eligible_user_ids,
|
||||
long_term_idle_user_ids=long_term_idle_user_ids,
|
||||
default_bot_user_ids=default_bot_user_ids,
|
||||
service_bot_tuples=service_bot_tuples
|
||||
service_bot_tuples=service_bot_tuples,
|
||||
)
|
||||
return info
|
||||
|
||||
|
@ -1323,7 +1323,7 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str,
|
|||
stream_id = message['message'].recipient.type_id
|
||||
stream_topic: Optional[StreamTopicTarget] = StreamTopicTarget(
|
||||
stream_id=stream_id,
|
||||
topic_name=message['message'].topic_name()
|
||||
topic_name=message['message'].topic_name(),
|
||||
)
|
||||
else:
|
||||
stream_topic = None
|
||||
|
@ -1409,7 +1409,7 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str,
|
|||
stream_push_user_ids = message['stream_push_user_ids'],
|
||||
stream_email_user_ids = message['stream_email_user_ids'],
|
||||
mentioned_user_ids=mentioned_user_ids,
|
||||
mark_as_read=mark_as_read
|
||||
mark_as_read=mark_as_read,
|
||||
)
|
||||
|
||||
for um in user_messages:
|
||||
|
@ -1531,7 +1531,7 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str,
|
|||
"message": wide_message_dict,
|
||||
"trigger": event['trigger'],
|
||||
"user_profile_id": event["user_profile_id"],
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
# Note that this does not preserve the order of message ids
|
||||
|
@ -2050,7 +2050,7 @@ def check_schedule_message(sender: UserProfile, client: Client,
|
|||
topic_name: Optional[str], message_content: str,
|
||||
delivery_type: str, deliver_at: datetime.datetime,
|
||||
realm: Optional[Realm]=None,
|
||||
forwarder_user_profile: Optional[UserProfile]=None
|
||||
forwarder_user_profile: Optional[UserProfile]=None,
|
||||
) -> int:
|
||||
addressee = Addressee.legacy_build(
|
||||
sender,
|
||||
|
@ -2334,7 +2334,7 @@ def _internal_prep_message(realm: Realm,
|
|||
|
||||
def internal_prep_stream_message(
|
||||
realm: Realm, sender: UserProfile,
|
||||
stream: Stream, topic: str, content: str
|
||||
stream: Stream, topic: str, content: str,
|
||||
) -> Optional[Dict[str, Any]]:
|
||||
"""
|
||||
See _internal_prep_message for details of how this works.
|
||||
|
@ -2350,7 +2350,7 @@ def internal_prep_stream_message(
|
|||
|
||||
def internal_prep_stream_message_by_name(
|
||||
realm: Realm, sender: UserProfile,
|
||||
stream_name: str, topic: str, content: str
|
||||
stream_name: str, topic: str, content: str,
|
||||
) -> Optional[Dict[str, Any]]:
|
||||
"""
|
||||
See _internal_prep_message for details of how this works.
|
||||
|
@ -2400,7 +2400,7 @@ def internal_send_stream_message(
|
|||
|
||||
message = internal_prep_stream_message(
|
||||
realm, sender, stream,
|
||||
topic, content
|
||||
topic, content,
|
||||
)
|
||||
|
||||
if message is None:
|
||||
|
@ -2410,11 +2410,11 @@ def internal_send_stream_message(
|
|||
|
||||
def internal_send_stream_message_by_name(
|
||||
realm: Realm, sender: UserProfile,
|
||||
stream_name: str, topic: str, content: str
|
||||
stream_name: str, topic: str, content: str,
|
||||
) -> Optional[int]:
|
||||
message = internal_prep_stream_message_by_name(
|
||||
realm, sender, stream_name,
|
||||
topic, content
|
||||
topic, content,
|
||||
)
|
||||
|
||||
if message is None:
|
||||
|
@ -2591,7 +2591,7 @@ def get_subscribers_query(stream: Stream, requesting_user: Optional[UserProfile]
|
|||
# want to be able to easily reactivate them with their old subscriptions. This
|
||||
# is why the query here has to look at the UserProfile.is_active flag.
|
||||
subscriptions = get_active_subscriptions_for_stream_id(stream.id).filter(
|
||||
user_profile__is_active=True
|
||||
user_profile__is_active=True,
|
||||
)
|
||||
return subscriptions
|
||||
|
||||
|
@ -3039,7 +3039,7 @@ def log_subscription_property_change(user_email: str, stream_name: str, property
|
|||
log_event(event)
|
||||
|
||||
def do_change_subscription_property(user_profile: UserProfile, sub: Subscription,
|
||||
stream: Stream, property_name: str, value: Any
|
||||
stream: Stream, property_name: str, value: Any,
|
||||
) -> None:
|
||||
database_property_name = property_name
|
||||
event_property_name = property_name
|
||||
|
@ -3147,16 +3147,16 @@ def do_change_bot_owner(user_profile: UserProfile, bot_owner: UserProfile,
|
|||
bot=dict(
|
||||
user_id=user_profile.id,
|
||||
)),
|
||||
{previous_owner.id, })
|
||||
{previous_owner.id})
|
||||
# Do not send update event for previous bot owner.
|
||||
update_users = update_users - {previous_owner.id, }
|
||||
update_users = update_users - {previous_owner.id}
|
||||
|
||||
# Notify the new owner that the bot has been added.
|
||||
if not bot_owner.is_realm_admin:
|
||||
add_event = created_bot_event(user_profile)
|
||||
send_event(user_profile.realm, add_event, {bot_owner.id, })
|
||||
send_event(user_profile.realm, add_event, {bot_owner.id})
|
||||
# Do not send update event for bot_owner.
|
||||
update_users = update_users - {bot_owner.id, }
|
||||
update_users = update_users - {bot_owner.id}
|
||||
|
||||
send_event(user_profile.realm,
|
||||
dict(type='realm_bot',
|
||||
|
@ -3235,7 +3235,7 @@ def notify_avatar_url_change(user_profile: UserProfile) -> None:
|
|||
avatar_version=user_profile.avatar_version,
|
||||
# Even clients using client_gravatar don't need the email,
|
||||
# since we're sending the URL anyway.
|
||||
user_id=user_profile.id
|
||||
user_id=user_profile.id,
|
||||
)
|
||||
|
||||
send_event(user_profile.realm,
|
||||
|
@ -3418,7 +3418,7 @@ def do_change_stream_invite_only(stream: Stream, invite_only: bool,
|
|||
history_public_to_subscribers = get_default_value_for_history_public_to_subscribers(
|
||||
stream.realm,
|
||||
invite_only,
|
||||
history_public_to_subscribers
|
||||
history_public_to_subscribers,
|
||||
)
|
||||
stream.invite_only = invite_only
|
||||
stream.history_public_to_subscribers = history_public_to_subscribers
|
||||
|
@ -3530,7 +3530,7 @@ def do_rename_stream(stream: Stream,
|
|||
'user_name': user_profile.full_name,
|
||||
'user_id': user_profile.id,
|
||||
'old_stream_name': old_name,
|
||||
'new_stream_name': new_name}
|
||||
'new_stream_name': new_name},
|
||||
)
|
||||
# Even though the token doesn't change, the web client needs to update the
|
||||
# email forwarding address to display the correctly-escaped new name.
|
||||
|
@ -3548,7 +3548,7 @@ def do_change_stream_description(stream: Stream, new_description: str) -> None:
|
|||
name=stream.name,
|
||||
stream_id=stream.id,
|
||||
value=new_description,
|
||||
rendered_description=stream.rendered_description
|
||||
rendered_description=stream.rendered_description,
|
||||
)
|
||||
send_event(stream.realm, event, can_access_stream_user_ids(stream))
|
||||
|
||||
|
@ -3605,7 +3605,7 @@ def do_create_realm(string_id: str, name: str,
|
|||
sender,
|
||||
signups_stream,
|
||||
topic,
|
||||
signup_message
|
||||
signup_message,
|
||||
)
|
||||
except Stream.DoesNotExist: # nocoverage
|
||||
# If the signups stream hasn't been created in the admin
|
||||
|
@ -3683,14 +3683,14 @@ def lookup_default_stream_groups(default_stream_group_names: List[str],
|
|||
def notify_default_streams(realm: Realm) -> None:
|
||||
event = dict(
|
||||
type="default_streams",
|
||||
default_streams=streams_to_dicts_sorted(get_default_streams_for_realm(realm.id))
|
||||
default_streams=streams_to_dicts_sorted(get_default_streams_for_realm(realm.id)),
|
||||
)
|
||||
send_event(realm, event, active_non_guest_user_ids(realm.id))
|
||||
|
||||
def notify_default_stream_groups(realm: Realm) -> None:
|
||||
event = dict(
|
||||
type="default_stream_groups",
|
||||
default_stream_groups=default_stream_groups_to_dicts_sorted(get_default_stream_groups(realm))
|
||||
default_stream_groups=default_stream_groups_to_dicts_sorted(get_default_stream_groups(realm)),
|
||||
)
|
||||
send_event(realm, event, active_non_guest_user_ids(realm.id))
|
||||
|
||||
|
@ -3866,13 +3866,13 @@ def do_update_user_presence(user_profile: UserProfile,
|
|||
defaults = dict(
|
||||
timestamp=log_time,
|
||||
status=status,
|
||||
realm_id=user_profile.realm_id
|
||||
realm_id=user_profile.realm_id,
|
||||
)
|
||||
|
||||
(presence, created) = UserPresence.objects.get_or_create(
|
||||
user_profile = user_profile,
|
||||
client = client,
|
||||
defaults = defaults
|
||||
defaults = defaults,
|
||||
)
|
||||
|
||||
stale_status = (log_time - presence.timestamp) > datetime.timedelta(minutes=1, seconds=10)
|
||||
|
@ -3992,13 +3992,13 @@ def do_mark_all_as_read(user_profile: UserProfile, client: Client) -> int:
|
|||
log_statsd_event('bankruptcy')
|
||||
|
||||
msgs = UserMessage.objects.filter(
|
||||
user_profile=user_profile
|
||||
user_profile=user_profile,
|
||||
).extra(
|
||||
where=[UserMessage.where_unread()]
|
||||
where=[UserMessage.where_unread()],
|
||||
)
|
||||
|
||||
count = msgs.update(
|
||||
flags=F('flags').bitor(UserMessage.flags.read)
|
||||
flags=F('flags').bitor(UserMessage.flags.read),
|
||||
)
|
||||
|
||||
event = dict(
|
||||
|
@ -4006,7 +4006,7 @@ def do_mark_all_as_read(user_profile: UserProfile, client: Client) -> int:
|
|||
operation='add',
|
||||
flag='read',
|
||||
messages=[], # we don't send messages, since the client reloads anyway
|
||||
all=True
|
||||
all=True,
|
||||
)
|
||||
send_event(user_profile.realm, event, [user_profile.id])
|
||||
|
||||
|
@ -4028,7 +4028,7 @@ def do_mark_stream_messages_as_read(user_profile: UserProfile,
|
|||
log_statsd_event('mark_stream_as_read')
|
||||
|
||||
msgs = UserMessage.objects.filter(
|
||||
user_profile=user_profile
|
||||
user_profile=user_profile,
|
||||
)
|
||||
|
||||
recipient = stream.recipient
|
||||
|
@ -4041,13 +4041,13 @@ def do_mark_stream_messages_as_read(user_profile: UserProfile,
|
|||
)
|
||||
|
||||
msgs = msgs.extra(
|
||||
where=[UserMessage.where_unread()]
|
||||
where=[UserMessage.where_unread()],
|
||||
)
|
||||
|
||||
message_ids = list(msgs.values_list('message__id', flat=True))
|
||||
|
||||
count = msgs.update(
|
||||
flags=F('flags').bitor(UserMessage.flags.read)
|
||||
flags=F('flags').bitor(UserMessage.flags.read),
|
||||
)
|
||||
|
||||
event = dict(
|
||||
|
@ -4191,7 +4191,7 @@ def get_user_info_for_message_updates(message_id: int) -> MessageUpdateUserInfoR
|
|||
# decision we change in the future.
|
||||
query = UserMessage.objects.filter(
|
||||
message=message_id,
|
||||
flags=~UserMessage.flags.historical
|
||||
flags=~UserMessage.flags.historical,
|
||||
).values('user_profile_id', 'flags')
|
||||
rows = list(query)
|
||||
|
||||
|
@ -4284,7 +4284,7 @@ def do_update_embedded_data(user_profile: UserProfile,
|
|||
def user_info(um: UserMessage) -> Dict[str, Any]:
|
||||
return {
|
||||
'id': um.user_profile_id,
|
||||
'flags': um.flags_list()
|
||||
'flags': um.flags_list(),
|
||||
}
|
||||
send_event(user_profile.realm, event, list(map(user_info, ums)))
|
||||
|
||||
|
@ -4435,7 +4435,7 @@ def do_update_message(user_profile: UserProfile, message: Message,
|
|||
propagate_mode=propagate_mode,
|
||||
orig_topic_name=orig_topic_name,
|
||||
topic_name=topic_name,
|
||||
new_stream=new_stream
|
||||
new_stream=new_stream,
|
||||
)
|
||||
changed_messages += messages_list
|
||||
|
||||
|
@ -4458,13 +4458,13 @@ def do_update_message(user_profile: UserProfile, message: Message,
|
|||
def user_info(um: UserMessage) -> Dict[str, Any]:
|
||||
return {
|
||||
'id': um.user_profile_id,
|
||||
'flags': um.flags_list()
|
||||
'flags': um.flags_list(),
|
||||
}
|
||||
|
||||
def subscriber_info(user_id: int) -> Dict[str, Any]:
|
||||
return {
|
||||
'id': user_id,
|
||||
'flags': ['read']
|
||||
'flags': ['read'],
|
||||
}
|
||||
|
||||
# The following blocks arranges that users who are subscribed to a
|
||||
|
@ -4542,7 +4542,7 @@ def do_delete_messages(realm: Realm, messages: Iterable[Message]) -> None:
|
|||
# there are no UserMessage objects associated with the
|
||||
# message.
|
||||
events_and_users_to_notify.append(
|
||||
(event, message_id_to_notifiable_users.get(message.id, []))
|
||||
(event, message_id_to_notifiable_users.get(message.id, [])),
|
||||
)
|
||||
|
||||
move_messages_to_archive(message_ids, realm=realm)
|
||||
|
@ -4694,7 +4694,7 @@ def gather_subscriptions_helper(user_profile: UserProfile,
|
|||
all_streams,
|
||||
user_profile,
|
||||
streams_subscribed_map,
|
||||
stream_recipient
|
||||
stream_recipient,
|
||||
)
|
||||
else:
|
||||
# If we're not including subscribers, always return None,
|
||||
|
@ -4871,7 +4871,7 @@ def filter_presence_idle_user_ids(user_ids: Set[int]) -> List[int]:
|
|||
rows = UserPresence.objects.filter(
|
||||
user_profile_id__in=user_ids,
|
||||
status=UserPresence.ACTIVE,
|
||||
timestamp__gte=recent
|
||||
timestamp__gte=recent,
|
||||
).exclude(client__name="ZulipMobile").distinct('user_profile_id').values('user_profile_id')
|
||||
active_user_ids = {row['user_profile_id'] for row in rows}
|
||||
idle_user_ids = user_ids - active_user_ids
|
||||
|
@ -4916,7 +4916,7 @@ def estimate_recent_invites(realms: Iterable[Realm], *, days: int) -> int:
|
|||
recent_invites = RealmCount.objects.filter(
|
||||
realm__in=realms,
|
||||
property='invites_sent::day',
|
||||
end_time__gte=timezone_now() - datetime.timedelta(days=days)
|
||||
end_time__gte=timezone_now() - datetime.timedelta(days=days),
|
||||
).aggregate(Sum('value'))['value__sum']
|
||||
if recent_invites is None:
|
||||
return 0
|
||||
|
@ -5271,7 +5271,7 @@ def get_occupied_streams(realm: Realm) -> QuerySet:
|
|||
exists_expression = Exists(
|
||||
Subscription.objects.filter(active=True, user_profile__is_active=True,
|
||||
user_profile__realm=realm,
|
||||
recipient_id=OuterRef('recipient_id'))
|
||||
recipient_id=OuterRef('recipient_id')),
|
||||
)
|
||||
occupied_streams = Stream.objects.filter(realm=realm, deactivated=False) \
|
||||
.annotate(occupied=exists_expression).filter(occupied=True)
|
||||
|
@ -5285,7 +5285,7 @@ def get_web_public_streams(realm: Realm) -> List[Dict[str, Any]]:
|
|||
def do_get_streams(
|
||||
user_profile: UserProfile, include_public: bool=True,
|
||||
include_subscribed: bool=True, include_all_active: bool=False,
|
||||
include_default: bool=False, include_owner_subscribed: bool=False
|
||||
include_default: bool=False, include_owner_subscribed: bool=False,
|
||||
) -> List[Dict[str, Any]]:
|
||||
if include_all_active and not user_profile.is_api_super_user:
|
||||
raise JsonableError(_("User not authorized for this query"))
|
||||
|
@ -5490,7 +5490,7 @@ def notify_user_update_custom_profile_data(user_profile: UserProfile,
|
|||
send_event(user_profile.realm, event, active_user_ids(user_profile.realm.id))
|
||||
|
||||
def do_update_user_custom_profile_data_if_changed(user_profile: UserProfile,
|
||||
data: List[Dict[str, Union[int, str, List[int]]]]
|
||||
data: List[Dict[str, Union[int, str, List[int]]]],
|
||||
) -> None:
|
||||
with transaction.atomic():
|
||||
for field in data:
|
||||
|
@ -5518,7 +5518,7 @@ def do_update_user_custom_profile_data_if_changed(user_profile: UserProfile,
|
|||
"type": field_value.field.field_type})
|
||||
|
||||
def check_remove_custom_profile_field_value(user_profile: UserProfile,
|
||||
field_id: Union[int, str, List[int]]
|
||||
field_id: Union[int, str, List[int]],
|
||||
) -> None:
|
||||
try:
|
||||
field = CustomProfileField.objects.get(realm=user_profile.realm, id=field_id)
|
||||
|
@ -5584,7 +5584,7 @@ def do_update_outgoing_webhook_service(bot_profile: UserProfile,
|
|||
bot=dict(user_id=bot_profile.id,
|
||||
services = [dict(base_url=service.base_url,
|
||||
interface=service.interface,
|
||||
token=service.token,)],
|
||||
token=service.token)],
|
||||
),
|
||||
),
|
||||
bot_owner_user_ids(bot_profile))
|
||||
|
@ -5616,7 +5616,7 @@ def get_service_dicts_for_bot(user_profile_id: str) -> List[Dict[str, Any]]:
|
|||
elif user_profile.bot_type == UserProfile.EMBEDDED_BOT:
|
||||
try:
|
||||
service_dicts = [{'config_data': get_bot_config(user_profile),
|
||||
'service_name': services[0].name
|
||||
'service_name': services[0].name,
|
||||
}]
|
||||
# A ConfigError just means that there are no config entries for user_profile.
|
||||
except ConfigError:
|
||||
|
@ -5650,7 +5650,7 @@ def get_service_dicts_for_bots(bot_dicts: List[Dict[str, Any]],
|
|||
if bot_profile_id in embedded_bot_configs.keys():
|
||||
bot_config = embedded_bot_configs[bot_profile_id]
|
||||
service_dicts = [{'config_data': bot_config,
|
||||
'service_name': services[0].name
|
||||
'service_name': services[0].name,
|
||||
}]
|
||||
service_dicts_by_uid[bot_profile_id] = service_dicts
|
||||
return service_dicts_by_uid
|
||||
|
@ -5734,7 +5734,7 @@ def do_set_zoom_token(user: UserProfile, token: Optional[Dict[str, object]]) ->
|
|||
user.zoom_token = token
|
||||
user.save(update_fields=["zoom_token"])
|
||||
send_event(
|
||||
user.realm, dict(type="has_zoom_token", value=token is not None), [user.id]
|
||||
user.realm, dict(type="has_zoom_token", value=token is not None), [user.id],
|
||||
)
|
||||
|
||||
def notify_realm_export(user_profile: UserProfile) -> None:
|
||||
|
@ -5764,6 +5764,6 @@ def get_topic_messages(user_profile: UserProfile, stream: Stream,
|
|||
topic_name: str) -> List[Message]:
|
||||
query = UserMessage.objects.filter(
|
||||
user_profile=user_profile,
|
||||
message__recipient=stream.recipient
|
||||
message__recipient=stream.recipient,
|
||||
).order_by("id")
|
||||
return [um.message for um in filter_by_topic_name_via_message(query, topic_name)]
|
||||
|
|
|
@ -75,7 +75,7 @@ class EmbeddedBotHandler:
|
|||
if message['type'] == 'stream':
|
||||
internal_send_stream_message_by_name(
|
||||
self.user_profile.realm, self.user_profile,
|
||||
message['to'], message['topic'], message['content']
|
||||
message['to'], message['topic'], message['content'],
|
||||
)
|
||||
return
|
||||
|
||||
|
|
|
@ -100,13 +100,13 @@ EMOJI_REGEX = r'(?P<syntax>:[\w\-\+]+:)'
|
|||
def verbose_compile(pattern: str) -> Any:
|
||||
return re.compile(
|
||||
"^(.*?)%s(.*?)$" % (pattern,),
|
||||
re.DOTALL | re.UNICODE | re.VERBOSE
|
||||
re.DOTALL | re.UNICODE | re.VERBOSE,
|
||||
)
|
||||
|
||||
def normal_compile(pattern: str) -> Any:
|
||||
return re.compile(
|
||||
r"^(.*?)%s(.*)$" % (pattern,),
|
||||
re.DOTALL | re.UNICODE
|
||||
re.DOTALL | re.UNICODE,
|
||||
)
|
||||
|
||||
STREAM_LINK_REGEX = r"""
|
||||
|
@ -318,7 +318,7 @@ class ElementPair:
|
|||
self.value = value
|
||||
|
||||
def walk_tree_with_family(root: Element,
|
||||
processor: Callable[[Element], Optional[_T]]
|
||||
processor: Callable[[Element], Optional[_T]],
|
||||
) -> List[ResultWithFamily[_T]]:
|
||||
results = []
|
||||
|
||||
|
@ -339,12 +339,12 @@ def walk_tree_with_family(root: Element,
|
|||
grandparent=grandparent,
|
||||
parent=currElementPair.value,
|
||||
child=child,
|
||||
in_blockquote=has_blockquote_ancestor(currElementPair)
|
||||
in_blockquote=has_blockquote_ancestor(currElementPair),
|
||||
)
|
||||
|
||||
results.append(ResultWithFamily(
|
||||
family=family,
|
||||
result=result
|
||||
result=result,
|
||||
))
|
||||
|
||||
return results
|
||||
|
@ -547,7 +547,7 @@ class InlineInterestingLinkProcessor(markdown.treeprocessors.Treeprocessor):
|
|||
class_attr: str="message_inline_image",
|
||||
data_id: Optional[str]=None,
|
||||
insertion_index: Optional[int]=None,
|
||||
already_thumbnailed: Optional[bool]=False
|
||||
already_thumbnailed: Optional[bool]=False,
|
||||
) -> None:
|
||||
desc = desc if desc is not None else ""
|
||||
|
||||
|
@ -576,10 +576,10 @@ class InlineInterestingLinkProcessor(markdown.treeprocessors.Treeprocessor):
|
|||
# consistency in what gets passed to /thumbnail
|
||||
url = url.lstrip('/')
|
||||
img.set("src", "/thumbnail?url={}&size=thumbnail".format(
|
||||
urllib.parse.quote(url, safe='')
|
||||
urllib.parse.quote(url, safe=''),
|
||||
))
|
||||
img.set('data-src-fullsize', "/thumbnail?url={}&size=full".format(
|
||||
urllib.parse.quote(url, safe='')
|
||||
urllib.parse.quote(url, safe=''),
|
||||
))
|
||||
else:
|
||||
img.set("src", url)
|
||||
|
@ -1133,7 +1133,7 @@ class InlineInterestingLinkProcessor(markdown.treeprocessors.Treeprocessor):
|
|||
if image_source is not None:
|
||||
found_url = ResultWithFamily(
|
||||
family=found_url.family,
|
||||
result=(image_source, image_source)
|
||||
result=(image_source, image_source),
|
||||
)
|
||||
self.handle_image_inlining(root, found_url)
|
||||
continue
|
||||
|
@ -1822,7 +1822,7 @@ class Bugdown(markdown.Markdown):
|
|||
"Realm-specific filters for realm_filters_key %s" % (kwargs['realm'],)],
|
||||
"realm": [kwargs['realm'], "Realm id"],
|
||||
"code_block_processor_disabled": [kwargs['code_block_processor_disabled'],
|
||||
"Disabled for email gateway"]
|
||||
"Disabled for email gateway"],
|
||||
}
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
@ -2014,7 +2014,7 @@ def build_engine(realm_filters: List[Tuple[str, str, int]],
|
|||
tables.makeExtension(),
|
||||
codehilite.makeExtension(
|
||||
linenums=False,
|
||||
guess_lang=False
|
||||
guess_lang=False,
|
||||
),
|
||||
])
|
||||
return engine
|
||||
|
@ -2104,7 +2104,7 @@ def get_email_info(realm_id: int, emails: Set[str]) -> Dict[str, FullNameInfo]:
|
|||
}
|
||||
|
||||
rows = UserProfile.objects.filter(
|
||||
realm_id=realm_id
|
||||
realm_id=realm_id,
|
||||
).filter(
|
||||
functools.reduce(lambda a, b: a | b, q_list),
|
||||
).values(
|
||||
|
|
|
@ -24,7 +24,7 @@ class MarkdownArgumentsTableGenerator(Extension):
|
|||
|
||||
def extendMarkdown(self, md: markdown.Markdown, md_globals: Dict[str, Any]) -> None:
|
||||
md.preprocessors.add(
|
||||
'generate_api_arguments', APIArgumentsTablePreprocessor(md, self.getConfigs()), '_begin'
|
||||
'generate_api_arguments', APIArgumentsTablePreprocessor(md, self.getConfigs()), '_begin',
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ class MarkdownReturnValuesTableGenerator(Extension):
|
|||
|
||||
def extendMarkdown(self, md: markdown.Markdown, md_globals: Dict[str, Any]) -> None:
|
||||
md.preprocessors.add(
|
||||
'generate_return_values', APIReturnValuesTablePreprocessor(md, self.getConfigs()), '_begin'
|
||||
'generate_return_values', APIReturnValuesTablePreprocessor(md, self.getConfigs()), '_begin',
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -133,8 +133,8 @@ class FencedCodeExtension(markdown.Extension):
|
|||
self.config = {
|
||||
'run_content_validators': [
|
||||
config.get('run_content_validators', False),
|
||||
'Boolean specifying whether to run content validation code in CodeHandler'
|
||||
]
|
||||
'Boolean specifying whether to run content validation code in CodeHandler',
|
||||
],
|
||||
}
|
||||
|
||||
for key, value in config.items():
|
||||
|
|
|
@ -15,7 +15,7 @@ class MarkdownIncludeCustom(MarkdownInclude):
|
|||
md.preprocessors.add(
|
||||
'include_wrapper',
|
||||
IncludeCustomPreprocessor(md, self.getConfigs()),
|
||||
'_begin'
|
||||
'_begin',
|
||||
)
|
||||
|
||||
class IncludeCustomPreprocessor(IncludePreprocessor):
|
||||
|
@ -39,7 +39,7 @@ class IncludeCustomPreprocessor(IncludePreprocessor):
|
|||
filename = os.path.expanduser(filename)
|
||||
if not os.path.isabs(filename):
|
||||
filename = os.path.normpath(
|
||||
os.path.join(self.base_path, filename)
|
||||
os.path.join(self.base_path, filename),
|
||||
)
|
||||
try:
|
||||
with open(filename, encoding=self.encoding) as r:
|
||||
|
|
|
@ -10,7 +10,7 @@ class NestedCodeBlocksRenderer(Extension):
|
|||
md.treeprocessors.add(
|
||||
'nested_code_blocks',
|
||||
NestedCodeBlocksRendererTreeProcessor(md, self.getConfigs()),
|
||||
'_end'
|
||||
'_end',
|
||||
)
|
||||
|
||||
class NestedCodeBlocksRendererTreeProcessor(markdown.treeprocessors.Treeprocessor):
|
||||
|
@ -33,7 +33,7 @@ class NestedCodeBlocksRendererTreeProcessor(markdown.treeprocessors.Treeprocesso
|
|||
return None
|
||||
|
||||
def get_nested_code_blocks(
|
||||
self, code_tags: List[ResultWithFamily[Tuple[str, Optional[str]]]]
|
||||
self, code_tags: List[ResultWithFamily[Tuple[str, Optional[str]]]],
|
||||
) -> List[ResultWithFamily[Tuple[str, Optional[str]]]]:
|
||||
nested_code_blocks = []
|
||||
for code_tag in code_tags:
|
||||
|
@ -59,7 +59,7 @@ class NestedCodeBlocksRendererTreeProcessor(markdown.treeprocessors.Treeprocesso
|
|||
def replace_element(
|
||||
self, parent: Optional[Element],
|
||||
replacement: Element,
|
||||
element_to_replace: Element
|
||||
element_to_replace: Element,
|
||||
) -> None:
|
||||
if parent is None:
|
||||
return
|
||||
|
|
|
@ -124,7 +124,7 @@ def bulk_create_streams(realm: Realm,
|
|||
history_public_to_subscribers=options["history_public_to_subscribers"],
|
||||
is_web_public=options.get("is_web_public", False),
|
||||
is_in_zephyr_realm=realm.is_zephyr_mirror_realm,
|
||||
)
|
||||
),
|
||||
)
|
||||
# Sort streams by name before creating them so that we can have a
|
||||
# reliable ordering of `stream_id` across different python versions.
|
||||
|
|
|
@ -117,7 +117,7 @@ def get_cache_backend(cache_name: Optional[str]) -> BaseCache:
|
|||
|
||||
def get_cache_with_key(
|
||||
keyfunc: Callable[..., str],
|
||||
cache_name: Optional[str]=None
|
||||
cache_name: Optional[str]=None,
|
||||
) -> Callable[[Callable[..., ReturnT]], Callable[..., ReturnT]]:
|
||||
"""
|
||||
The main goal of this function getting value from the cache like in the "cache_with_key".
|
||||
|
@ -145,7 +145,7 @@ def get_cache_with_key(
|
|||
|
||||
def cache_with_key(
|
||||
keyfunc: Callable[..., str], cache_name: Optional[str]=None,
|
||||
timeout: Optional[int]=None, with_statsd_key: Optional[str]=None
|
||||
timeout: Optional[int]=None, with_statsd_key: Optional[str]=None,
|
||||
) -> Callable[[Callable[..., ReturnT]], Callable[..., ReturnT]]:
|
||||
"""Decorator which applies Django caching to a function.
|
||||
|
||||
|
@ -382,7 +382,7 @@ def generic_bulk_cached_fetch(
|
|||
cache_keys[object_id] = cache_key_function(object_id)
|
||||
|
||||
cached_objects_compressed: Dict[str, Tuple[CompressedItemT]] = safe_cache_get_many(
|
||||
[cache_keys[object_id] for object_id in object_ids]
|
||||
[cache_keys[object_id] for object_id in object_ids],
|
||||
)
|
||||
|
||||
cached_objects: Dict[str, CacheItemT] = {}
|
||||
|
@ -445,7 +445,7 @@ realm_user_dict_fields: List[str] = [
|
|||
'avatar_source', 'avatar_version', 'is_active',
|
||||
'role', 'is_bot', 'realm_id', 'timezone',
|
||||
'date_joined', 'bot_owner_id', 'delivery_email',
|
||||
'bot_type'
|
||||
'bot_type',
|
||||
]
|
||||
|
||||
def realm_user_dicts_cache_key(realm_id: int) -> str:
|
||||
|
|
|
@ -18,7 +18,7 @@ def generate_dev_ldap_dir(mode: str, num_users: int=8) -> Dict[str, Dict[str, An
|
|||
name = 'LDAP User %d' % (i,)
|
||||
email = 'ldapuser%d@zulip.com' % (i,)
|
||||
phone_number = '999999999%d' % (i,)
|
||||
birthdate = '19%02d-%02d-%02d' % (i, i, i,)
|
||||
birthdate = '19%02d-%02d-%02d' % (i, i, i)
|
||||
ldap_data.append((name, email, phone_number, birthdate))
|
||||
|
||||
profile_images = [open(path, "rb").read() for path in
|
||||
|
@ -28,26 +28,26 @@ def generate_dev_ldap_dir(mode: str, num_users: int=8) -> Dict[str, Dict[str, An
|
|||
email = user_data[1].lower()
|
||||
email_username = email.split('@')[0]
|
||||
common_data = {
|
||||
'cn': [user_data[0], ],
|
||||
'userPassword': [email_username, ],
|
||||
'phoneNumber': [user_data[2], ],
|
||||
'birthDate': [user_data[3], ],
|
||||
'cn': [user_data[0]],
|
||||
'userPassword': [email_username],
|
||||
'phoneNumber': [user_data[2]],
|
||||
'birthDate': [user_data[3]],
|
||||
}
|
||||
if mode == 'a':
|
||||
ldap_dir['uid=' + email + ',ou=users,dc=zulip,dc=com'] = dict(
|
||||
uid=[email, ],
|
||||
thumbnailPhoto=[profile_images[i % len(profile_images)], ],
|
||||
userAccountControl=[LDAP_USER_ACCOUNT_CONTROL_NORMAL, ],
|
||||
uid=[email],
|
||||
thumbnailPhoto=[profile_images[i % len(profile_images)]],
|
||||
userAccountControl=[LDAP_USER_ACCOUNT_CONTROL_NORMAL],
|
||||
**common_data)
|
||||
elif mode == 'b':
|
||||
ldap_dir['uid=' + email_username + ',ou=users,dc=zulip,dc=com'] = dict(
|
||||
uid=[email_username, ],
|
||||
jpegPhoto=[profile_images[i % len(profile_images)], ],
|
||||
uid=[email_username],
|
||||
jpegPhoto=[profile_images[i % len(profile_images)]],
|
||||
**common_data)
|
||||
elif mode == 'c':
|
||||
ldap_dir['uid=' + email_username + ',ou=users,dc=zulip,dc=com'] = dict(
|
||||
uid=[email_username, ],
|
||||
email=[email, ],
|
||||
uid=[email_username],
|
||||
email=[email],
|
||||
**common_data)
|
||||
|
||||
return ldap_dir
|
||||
|
|
|
@ -173,7 +173,7 @@ def handle_digest_email(user_profile_id: int, cutoff: float,
|
|||
|
||||
# Start building email template data.
|
||||
context.update({
|
||||
'unsubscribe_link': one_click_unsubscribe_link(user_profile, "digest")
|
||||
'unsubscribe_link': one_click_unsubscribe_link(user_profile, "digest"),
|
||||
})
|
||||
|
||||
home_view_streams = Subscription.objects.filter(
|
||||
|
@ -225,7 +225,7 @@ def exclude_subscription_modified_streams(user_profile: UserProfile,
|
|||
events = [
|
||||
RealmAuditLog.SUBSCRIPTION_CREATED,
|
||||
RealmAuditLog.SUBSCRIPTION_ACTIVATED,
|
||||
RealmAuditLog.SUBSCRIPTION_DEACTIVATED
|
||||
RealmAuditLog.SUBSCRIPTION_DEACTIVATED,
|
||||
]
|
||||
|
||||
# Streams where the user's subscription was changed
|
||||
|
|
|
@ -36,7 +36,7 @@ def get_display_recipient_remote_cache(recipient_id: int, recipient_type: int,
|
|||
# Right now, we order by ID, which matches the ordering of user
|
||||
# names in the left sidebar.
|
||||
user_profile_list = UserProfile.objects.filter(
|
||||
subscription__recipient_id=recipient_id
|
||||
subscription__recipient_id=recipient_id,
|
||||
).order_by('id').values(*display_recipient_fields)
|
||||
return list(user_profile_list)
|
||||
|
||||
|
@ -52,10 +52,10 @@ def bulk_get_user_profile_by_id(uids: List[int]) -> Dict[int, UserDisplayRecipie
|
|||
query_function=lambda ids: list(
|
||||
UserProfile.objects.filter(id__in=ids).values(*display_recipient_fields)),
|
||||
object_ids=uids,
|
||||
id_fetcher=user_dict_id_fetcher
|
||||
id_fetcher=user_dict_id_fetcher,
|
||||
)
|
||||
|
||||
def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]]
|
||||
def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]],
|
||||
) -> Dict[int, DisplayRecipientT]:
|
||||
"""
|
||||
Takes set of tuples of the form (recipient_id, recipient_type, recipient_type_id)
|
||||
|
@ -102,7 +102,7 @@ def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]]
|
|||
# Now we have to create display_recipients for personal and huddle messages.
|
||||
# We do this via generic_bulk_cached_fetch, supplying apprioprate functions to it.
|
||||
|
||||
def personal_and_huddle_query_function(recipient_ids: List[int]
|
||||
def personal_and_huddle_query_function(recipient_ids: List[int],
|
||||
) -> List[Tuple[int, List[UserDisplayRecipient]]]:
|
||||
"""
|
||||
Return a list of tuples of the form (recipient_id, [list of UserProfiles])
|
||||
|
@ -116,7 +116,7 @@ def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]]
|
|||
recipients = [Recipient(
|
||||
id=recipient_id,
|
||||
type=recipient_id_to_type_pair_dict[recipient_id][0],
|
||||
type_id=recipient_id_to_type_pair_dict[recipient_id][1]
|
||||
type_id=recipient_id_to_type_pair_dict[recipient_id][1],
|
||||
) for recipient_id in recipient_ids]
|
||||
|
||||
# Find all user ids whose UserProfiles we will need to fetch:
|
||||
|
@ -144,7 +144,7 @@ def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]]
|
|||
|
||||
return result
|
||||
|
||||
def personal_and_huddle_cache_transformer(db_object: Tuple[int, List[UserDisplayRecipient]]
|
||||
def personal_and_huddle_cache_transformer(db_object: Tuple[int, List[UserDisplayRecipient]],
|
||||
) -> List[UserDisplayRecipient]:
|
||||
"""
|
||||
Takes an element of the list returned by the query_function, maps it to the final
|
||||
|
@ -167,7 +167,7 @@ def bulk_fetch_display_recipients(recipient_tuples: Set[Tuple[int, int, int]]
|
|||
query_function=personal_and_huddle_query_function,
|
||||
object_ids=[recipient[0] for recipient in personal_and_huddle_recipients],
|
||||
id_fetcher=personal_and_huddle_id_fetcher,
|
||||
cache_transformer=personal_and_huddle_cache_transformer
|
||||
cache_transformer=personal_and_huddle_cache_transformer,
|
||||
)
|
||||
|
||||
# Glue the dicts together and return:
|
||||
|
|
|
@ -69,7 +69,7 @@ def report_to_zulip(error_message: str) -> None:
|
|||
error_bot,
|
||||
error_stream,
|
||||
"email mirror error",
|
||||
f"""~~~\n{error_message}\n~~~"""
|
||||
f"""~~~\n{error_message}\n~~~""",
|
||||
)
|
||||
|
||||
def log_and_report(email_message: EmailMessage, error_message: str, to: Optional[str]) -> None:
|
||||
|
@ -114,7 +114,7 @@ def get_usable_missed_message_address(address: str) -> MissedMessageEmailAddress
|
|||
try:
|
||||
mm_address = MissedMessageEmailAddress.objects.select_related().get(
|
||||
email_token=token,
|
||||
timestamp__gt=timezone_now() - timedelta(seconds=MissedMessageEmailAddress.EXPIRY_SECONDS)
|
||||
timestamp__gt=timezone_now() - timedelta(seconds=MissedMessageEmailAddress.EXPIRY_SECONDS),
|
||||
)
|
||||
except MissedMessageEmailAddress.DoesNotExist:
|
||||
raise ZulipEmailForwardError("Missed message address expired or doesn't exist.")
|
||||
|
@ -371,7 +371,7 @@ def process_missed_message(to: str, message: EmailMessage) -> None:
|
|||
stream = get_stream_by_id_in_realm(recipient.type_id, user_profile.realm)
|
||||
internal_send_stream_message(
|
||||
user_profile.realm, user_profile, stream,
|
||||
topic, body
|
||||
topic, body,
|
||||
)
|
||||
recipient_str = stream.name
|
||||
elif recipient.type == Recipient.PERSONAL:
|
||||
|
@ -429,15 +429,15 @@ def mirror_email_message(data: Dict[str, str]) -> Dict[str, str]:
|
|||
except ZulipEmailForwardError as e:
|
||||
return {
|
||||
"status": "error",
|
||||
"msg": f"5.1.1 Bad destination mailbox address: {e}"
|
||||
"msg": f"5.1.1 Bad destination mailbox address: {e}",
|
||||
}
|
||||
|
||||
queue_json_publish(
|
||||
"email_mirror",
|
||||
{
|
||||
"message": data['msg_text'],
|
||||
"rcpt_to": rcpt_to
|
||||
}
|
||||
"rcpt_to": rcpt_to,
|
||||
},
|
||||
)
|
||||
return {"status": "success"}
|
||||
|
||||
|
|
|
@ -305,7 +305,7 @@ def do_send_missedmessage_events_reply_in_zulip(user_profile: UserProfile,
|
|||
if len(recipients) != 1:
|
||||
raise ValueError(
|
||||
'All missed_messages must have the same recipient and topic %r' %
|
||||
(recipients,)
|
||||
(recipients,),
|
||||
)
|
||||
|
||||
# This link is no longer a part of the email, but keeping the code in case
|
||||
|
@ -495,7 +495,7 @@ def handle_missedmessage_emails(user_profile_id: int,
|
|||
for m in messages_by_bucket[bucket_tup]:
|
||||
unique_messages[m.id] = dict(
|
||||
message=m,
|
||||
trigger=message_ids.get(m.id)
|
||||
trigger=message_ids.get(m.id),
|
||||
)
|
||||
do_send_missedmessage_events_reply_in_zulip(
|
||||
user_profile,
|
||||
|
|
|
@ -17,7 +17,7 @@ if not os.path.exists(emoji_codes_path): # nocoverage
|
|||
# prod-static/serve/generated/emoji won't exist yet.
|
||||
emoji_codes_path = os.path.join(
|
||||
os.path.dirname(__file__),
|
||||
"../../static/generated/emoji/emoji_codes.json"
|
||||
"../../static/generated/emoji/emoji_codes.json",
|
||||
)
|
||||
|
||||
with open(emoji_codes_path) as fp:
|
||||
|
|
|
@ -83,7 +83,7 @@ def zulip_browser_error(report: Dict[str, Any]) -> None:
|
|||
error_bot,
|
||||
errors_stream,
|
||||
format_email_subject(email_subject),
|
||||
body
|
||||
body,
|
||||
)
|
||||
|
||||
def notify_server_error(report: Dict[str, Any], skip_error_zulip: Optional[bool]=False) -> None:
|
||||
|
@ -125,7 +125,7 @@ def zulip_server_error(report: Dict[str, Any]) -> None:
|
|||
error_bot,
|
||||
errors_stream,
|
||||
format_email_subject(email_subject),
|
||||
message
|
||||
message,
|
||||
)
|
||||
|
||||
def email_server_error(report: Dict[str, Any]) -> None:
|
||||
|
|
|
@ -7,7 +7,7 @@ from django.utils.translation import ugettext as _
|
|||
from django.conf import settings
|
||||
from importlib import import_module
|
||||
from typing import (
|
||||
Any, Callable, Dict, Iterable, Optional, Sequence, Set
|
||||
Any, Callable, Dict, Iterable, Optional, Sequence, Set,
|
||||
)
|
||||
|
||||
session_engine = import_module(settings.SESSION_ENGINE)
|
||||
|
@ -56,7 +56,7 @@ from zerver.models import (
|
|||
Client, Message, Realm, UserProfile, UserMessage,
|
||||
realm_filters_for_realm,
|
||||
custom_profile_fields_for_realm, get_realm_domains,
|
||||
get_default_stream_groups, CustomProfileField, Stream
|
||||
get_default_stream_groups, CustomProfileField, Stream,
|
||||
)
|
||||
from zproject.backends import email_auth_enabled, password_auth_enabled
|
||||
from version import ZULIP_VERSION, API_FEATURE_LEVEL
|
||||
|
@ -255,7 +255,7 @@ def fetch_initial_state_data(user_profile: UserProfile,
|
|||
for integration in WEBHOOK_INTEGRATIONS:
|
||||
realm_incoming_webhook_bots.append({
|
||||
'name': integration.name,
|
||||
'config': {c[1]: c[0] for c in integration.config_options}
|
||||
'config': {c[1]: c[0] for c in integration.config_options},
|
||||
})
|
||||
state['realm_incoming_webhook_bots'] = realm_incoming_webhook_bots
|
||||
|
||||
|
@ -375,7 +375,7 @@ def apply_event(state: Dict[str, Any],
|
|||
conversations[recipient_id] = dict(
|
||||
user_ids=sorted([user_dict['id'] for user_dict in
|
||||
event['message']['display_recipient'] if
|
||||
user_dict['id'] != user_profile.id])
|
||||
user_dict['id'] != user_profile.id]),
|
||||
)
|
||||
conversations[recipient_id]['max_message_id'] = event['message']['id']
|
||||
return
|
||||
|
@ -482,11 +482,11 @@ def apply_event(state: Dict[str, Any],
|
|||
if 'rendered_value' in person['custom_profile_field']:
|
||||
p['profile_data'][custom_field_id] = {
|
||||
'value': custom_field_new_value,
|
||||
'rendered_value': person['custom_profile_field']['rendered_value']
|
||||
'rendered_value': person['custom_profile_field']['rendered_value'],
|
||||
}
|
||||
else:
|
||||
p['profile_data'][custom_field_id] = {
|
||||
'value': custom_field_new_value
|
||||
'value': custom_field_new_value,
|
||||
}
|
||||
|
||||
elif event['type'] == 'realm_bot':
|
||||
|
@ -926,7 +926,7 @@ def post_process_state(user_profile: UserProfile, ret: Dict[str, Any],
|
|||
# Reformat recent_private_conversations to be a list of dictionaries, rather than a dict.
|
||||
ret['recent_private_conversations'] = sorted([
|
||||
dict(
|
||||
**value
|
||||
**value,
|
||||
) for (recipient_id, value) in ret['raw_recent_private_conversations'].items()
|
||||
], key = lambda x: -x["max_message_id"])
|
||||
del ret['raw_recent_private_conversations']
|
||||
|
|
|
@ -463,7 +463,7 @@ def export_from_config(response: TableData, config: Config, seed_object: Optiona
|
|||
config.custom_fetch(
|
||||
response=response,
|
||||
config=config,
|
||||
context=context
|
||||
context=context,
|
||||
)
|
||||
if config.custom_tables:
|
||||
for t in config.custom_tables:
|
||||
|
@ -533,7 +533,7 @@ def export_from_config(response: TableData, config: Config, seed_object: Optiona
|
|||
config.post_process_data(
|
||||
response=response,
|
||||
config=config,
|
||||
context=context
|
||||
context=context,
|
||||
)
|
||||
|
||||
# Now walk our children. It's extremely important to respect
|
||||
|
@ -551,7 +551,7 @@ def get_realm_config() -> Config:
|
|||
|
||||
realm_config = Config(
|
||||
table='zerver_realm',
|
||||
is_seeded=True
|
||||
is_seeded=True,
|
||||
)
|
||||
|
||||
Config(
|
||||
|
@ -593,7 +593,7 @@ def get_realm_config() -> Config:
|
|||
table='zerver_client',
|
||||
model=Client,
|
||||
virtual_parent=realm_config,
|
||||
use_all=True
|
||||
use_all=True,
|
||||
)
|
||||
|
||||
user_profile_config = Config(
|
||||
|
@ -740,7 +740,7 @@ def get_realm_config() -> Config:
|
|||
id_source=('_stream_recipient', 'type_id'),
|
||||
source_filter=lambda r: r['type'] == Recipient.STREAM,
|
||||
exclude=['email_token'],
|
||||
post_process_data=sanity_check_stream_data
|
||||
post_process_data=sanity_check_stream_data,
|
||||
)
|
||||
|
||||
#
|
||||
|
@ -773,7 +773,7 @@ def get_realm_config() -> Config:
|
|||
'_user_subscription',
|
||||
'_stream_subscription',
|
||||
'_huddle_subscription',
|
||||
]
|
||||
],
|
||||
)
|
||||
|
||||
return realm_config
|
||||
|
@ -999,7 +999,7 @@ def export_partial_message_files(realm: Realm,
|
|||
# were specified as being allowed to be exported. "Them"
|
||||
# refers to other users.
|
||||
user_ids_for_us = get_ids(
|
||||
response['zerver_userprofile']
|
||||
response['zerver_userprofile'],
|
||||
)
|
||||
ids_of_our_possible_senders = get_ids(
|
||||
response['zerver_userprofile'] +
|
||||
|
@ -1408,7 +1408,7 @@ def export_emoji_from_local(realm: Realm, local_dir: Path, output_dir: Path) ->
|
|||
for realm_emoji in RealmEmoji.objects.filter(realm_id=realm.id):
|
||||
emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(
|
||||
realm_id=realm.id,
|
||||
emoji_file_name=realm_emoji.file_name
|
||||
emoji_file_name=realm_emoji.file_name,
|
||||
)
|
||||
|
||||
# Use 'mark_sanitized' to work around false positive caused by Pysa
|
||||
|
@ -1490,7 +1490,7 @@ def do_export_realm(realm: Realm, output_dir: Path, threads: int,
|
|||
response=response,
|
||||
config=realm_config,
|
||||
seed_object=realm,
|
||||
context=dict(realm=realm, exportable_user_ids=exportable_user_ids)
|
||||
context=dict(realm=realm, exportable_user_ids=exportable_user_ids),
|
||||
)
|
||||
logging.info('...DONE with get_realm_config() data')
|
||||
|
||||
|
@ -1584,7 +1584,7 @@ def launch_user_message_subprocesses(threads: int, output_dir: Path,
|
|||
os.path.join(settings.DEPLOY_ROOT, "manage.py"),
|
||||
'export_usermessage_batch',
|
||||
'--path', str(output_dir),
|
||||
'--thread', str(shard_id)
|
||||
'--thread', str(shard_id),
|
||||
]
|
||||
if consent_message_id is not None:
|
||||
arguments.extend(['--consent-message-id', str(consent_message_id)])
|
||||
|
|
|
@ -94,7 +94,7 @@ def fix_unsubscribed(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'get recipients',
|
||||
find_recipients
|
||||
find_recipients,
|
||||
)
|
||||
|
||||
if not recipient_ids:
|
||||
|
@ -129,7 +129,7 @@ def fix_unsubscribed(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'finding unread messages for non-active streams',
|
||||
find
|
||||
find,
|
||||
)
|
||||
|
||||
if not user_message_ids:
|
||||
|
@ -140,7 +140,7 @@ def fix_unsubscribed(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'fixing unread messages for non-active streams',
|
||||
fix
|
||||
fix,
|
||||
)
|
||||
|
||||
def fix_pre_pointer(cursor: CursorObj, user_profile: UserProfile) -> None:
|
||||
|
@ -176,7 +176,7 @@ def fix_pre_pointer(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'find_non_muted_recipients',
|
||||
find_non_muted_recipients
|
||||
find_non_muted_recipients,
|
||||
)
|
||||
|
||||
if not recipient_ids:
|
||||
|
@ -218,7 +218,7 @@ def fix_pre_pointer(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'finding pre-pointer messages that are not muted',
|
||||
find_old_ids
|
||||
find_old_ids,
|
||||
)
|
||||
|
||||
if not user_message_ids:
|
||||
|
@ -229,7 +229,7 @@ def fix_pre_pointer(cursor: CursorObj, user_profile: UserProfile) -> None:
|
|||
|
||||
get_timing(
|
||||
'fixing unread messages for pre-pointer non-muted messages',
|
||||
fix
|
||||
fix,
|
||||
)
|
||||
|
||||
def fix(user_profile: UserProfile) -> None:
|
||||
|
|
|
@ -60,7 +60,7 @@ def get_language_list_for_templates(default_language: str) -> List[Dict[str, Dic
|
|||
'name': name,
|
||||
'code': lang['code'],
|
||||
'percent': percent,
|
||||
'selected': selected
|
||||
'selected': selected,
|
||||
}
|
||||
|
||||
formatted_list.append(item)
|
||||
|
|
|
@ -653,7 +653,7 @@ def import_uploads(realm: Realm, import_dir: Path, processes: int, processing_av
|
|||
relative_path = "/".join([
|
||||
str(record['realm_id']),
|
||||
random_name(18),
|
||||
sanitize_name(os.path.basename(record['path']))
|
||||
sanitize_name(os.path.basename(record['path'])),
|
||||
])
|
||||
path_maps['attachment_path'][record['s3_path']] = relative_path
|
||||
|
||||
|
@ -1038,7 +1038,7 @@ def do_import_realm(import_dir: Path, subdomain: str, processes: int=1) -> Realm
|
|||
#
|
||||
# Longer-term, the plan is to eliminate pointer as a concept.
|
||||
first_unread_message = UserMessage.objects.filter(user_profile=user_profile).extra(
|
||||
where=[UserMessage.where_unread()]
|
||||
where=[UserMessage.where_unread()],
|
||||
).order_by("message_id").first()
|
||||
if first_unread_message is not None:
|
||||
user_profile.pointer = first_unread_message.message_id
|
||||
|
|
|
@ -74,7 +74,7 @@ class Integration:
|
|||
if category not in CATEGORIES:
|
||||
raise KeyError( # nocoverage
|
||||
'INTEGRATIONS: ' + name + ' - category \'' +
|
||||
category + '\' is not a key in CATEGORIES.'
|
||||
category + '\' is not a key in CATEGORIES.',
|
||||
)
|
||||
self.categories = list(map((lambda c: CATEGORIES[c]), categories))
|
||||
|
||||
|
@ -172,7 +172,7 @@ class WebhookIntegration(Integration):
|
|||
display_name=display_name,
|
||||
stream_name=stream_name,
|
||||
legacy=legacy,
|
||||
config_options=config_options
|
||||
config_options=config_options,
|
||||
)
|
||||
|
||||
if function is None:
|
||||
|
@ -242,7 +242,7 @@ class HubotIntegration(Integration):
|
|||
name, name, categories,
|
||||
logo=logo, display_name=display_name,
|
||||
doc = 'zerver/integrations/hubot_common.md',
|
||||
legacy=legacy
|
||||
legacy=legacy,
|
||||
)
|
||||
|
||||
class EmbeddedBotIntegration(Integration):
|
||||
|
@ -273,7 +273,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
'alertmanager',
|
||||
['monitoring'],
|
||||
display_name='Prometheus AlertManager',
|
||||
logo='images/integrations/logos/prometheus.svg'
|
||||
logo='images/integrations/logos/prometheus.svg',
|
||||
),
|
||||
WebhookIntegration('ansibletower', ['deployment'], display_name='Ansible Tower'),
|
||||
WebhookIntegration('appfollow', ['customer-support'], display_name='AppFollow'),
|
||||
|
@ -286,14 +286,14 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
['version-control'],
|
||||
logo='images/integrations/logos/bitbucket.svg',
|
||||
display_name='Bitbucket Server',
|
||||
stream_name='bitbucket'
|
||||
stream_name='bitbucket',
|
||||
),
|
||||
WebhookIntegration(
|
||||
'bitbucket2',
|
||||
['version-control'],
|
||||
logo='images/integrations/logos/bitbucket.svg',
|
||||
display_name='Bitbucket',
|
||||
stream_name='bitbucket'
|
||||
stream_name='bitbucket',
|
||||
),
|
||||
WebhookIntegration(
|
||||
'bitbucket',
|
||||
|
@ -301,7 +301,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
display_name='Bitbucket',
|
||||
secondary_line_text='(Enterprise)',
|
||||
stream_name='commits',
|
||||
legacy=True
|
||||
legacy=True,
|
||||
),
|
||||
WebhookIntegration('buildbot', ['continuous-integration'], display_name='Buildbot'),
|
||||
WebhookIntegration('circleci', ['continuous-integration'], display_name='CircleCI'),
|
||||
|
@ -315,7 +315,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
['customer-support'],
|
||||
logo='images/integrations/logos/deskcom.png',
|
||||
display_name='Desk.com',
|
||||
stream_name='desk'
|
||||
stream_name='desk',
|
||||
),
|
||||
WebhookIntegration('dropbox', ['productivity'], display_name='Dropbox'),
|
||||
WebhookIntegration('errbit', ['monitoring'], display_name='Errbit'),
|
||||
|
@ -329,7 +329,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
display_name='GitHub',
|
||||
logo='images/integrations/logos/github.svg',
|
||||
function='zerver.webhooks.github.view.api_github_webhook',
|
||||
stream_name='github'
|
||||
stream_name='github',
|
||||
),
|
||||
WebhookIntegration('gitlab', ['version-control'], display_name='GitLab'),
|
||||
WebhookIntegration('gocd', ['continuous-integration'], display_name='GoCD'),
|
||||
|
@ -347,7 +347,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
'ifttt',
|
||||
['meta-integration'],
|
||||
function='zerver.webhooks.ifttt.view.api_iftt_app_webhook',
|
||||
display_name='IFTTT'
|
||||
display_name='IFTTT',
|
||||
),
|
||||
WebhookIntegration('insping', ['monitoring'], display_name='Insping'),
|
||||
WebhookIntegration('intercom', ['customer-support'], display_name='Intercom'),
|
||||
|
@ -361,7 +361,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
['monitoring'],
|
||||
display_name='Opbeat',
|
||||
stream_name='opbeat',
|
||||
function='zerver.webhooks.opbeat.view.api_opbeat_webhook'
|
||||
function='zerver.webhooks.opbeat.view.api_opbeat_webhook',
|
||||
),
|
||||
WebhookIntegration('opsgenie', ['meta-integration', 'monitoring']),
|
||||
WebhookIntegration('pagerduty', ['monitoring'], display_name='PagerDuty'),
|
||||
|
@ -394,7 +394,7 @@ WEBHOOK_INTEGRATIONS: List[WebhookIntegration] = [
|
|||
'yo',
|
||||
['communication'],
|
||||
function='zerver.webhooks.yo.view.api_yo_app_webhook',
|
||||
display_name='Yo App'
|
||||
display_name='Yo App',
|
||||
),
|
||||
WebhookIntegration('wordpress', ['marketing'], display_name='WordPress'),
|
||||
WebhookIntegration('zapier', ['meta-integration']),
|
||||
|
@ -411,7 +411,7 @@ INTEGRATIONS: Dict[str, Integration] = {
|
|||
'capistrano',
|
||||
['deployment'],
|
||||
display_name='Capistrano',
|
||||
doc='zerver/integrations/capistrano.md'
|
||||
doc='zerver/integrations/capistrano.md',
|
||||
),
|
||||
'codebase': Integration('codebase', 'codebase', ['version-control'],
|
||||
doc='zerver/integrations/codebase.md'),
|
||||
|
@ -428,7 +428,7 @@ INTEGRATIONS: Dict[str, Integration] = {
|
|||
'google-calendar',
|
||||
['productivity'],
|
||||
display_name='Google Calendar',
|
||||
doc='zerver/integrations/google-calendar.md'
|
||||
doc='zerver/integrations/google-calendar.md',
|
||||
),
|
||||
'hubot': Integration('hubot', 'hubot', ['meta-integration', 'bots'], doc='zerver/integrations/hubot.md'),
|
||||
'irc': Integration('irc', 'irc', ['communication'], display_name='IRC',
|
||||
|
@ -438,7 +438,7 @@ INTEGRATIONS: Dict[str, Integration] = {
|
|||
'jenkins',
|
||||
['continuous-integration'],
|
||||
secondary_line_text='(or Hudson)',
|
||||
doc='zerver/integrations/jenkins.md'
|
||||
doc='zerver/integrations/jenkins.md',
|
||||
),
|
||||
'jira-plugin': Integration(
|
||||
'jira-plugin',
|
||||
|
@ -449,7 +449,7 @@ INTEGRATIONS: Dict[str, Integration] = {
|
|||
display_name='JIRA',
|
||||
doc='zerver/integrations/jira-plugin.md',
|
||||
stream_name='jira',
|
||||
legacy=True
|
||||
legacy=True,
|
||||
),
|
||||
'matrix': Integration('matrix', 'matrix', ['communication'],
|
||||
doc='zerver/integrations/matrix.md'),
|
||||
|
@ -490,7 +490,7 @@ INTEGRATIONS: Dict[str, Integration] = {
|
|||
display_name='Trello',
|
||||
doc='zerver/integrations/trello-plugin.md',
|
||||
stream_name='trello',
|
||||
legacy=True
|
||||
legacy=True,
|
||||
),
|
||||
'twitter': Integration('twitter', 'twitter', ['customer-support', 'marketing'],
|
||||
# _ needed to get around adblock plus
|
||||
|
|
|
@ -53,7 +53,7 @@ from zerver.models import (
|
|||
Reaction,
|
||||
get_usermessage_by_message_id,
|
||||
MAX_MESSAGE_LENGTH,
|
||||
MAX_TOPIC_NAME_LENGTH
|
||||
MAX_TOPIC_NAME_LENGTH,
|
||||
)
|
||||
|
||||
from typing import Any, Dict, List, Optional, Set, Tuple, Sequence
|
||||
|
@ -236,7 +236,7 @@ class MessageDict:
|
|||
new_obj,
|
||||
apply_markdown=apply_markdown,
|
||||
client_gravatar=client_gravatar,
|
||||
keep_rendered_content=keep_rendered_content
|
||||
keep_rendered_content=keep_rendered_content,
|
||||
)
|
||||
return new_obj
|
||||
|
||||
|
@ -532,7 +532,7 @@ class MessageDict:
|
|||
(
|
||||
obj['recipient_id'],
|
||||
obj['recipient_type'],
|
||||
obj['recipient_type_id']
|
||||
obj['recipient_type_id'],
|
||||
) for obj in objs
|
||||
}
|
||||
display_recipients = bulk_fetch_display_recipients(recipient_tuples)
|
||||
|
@ -732,13 +732,13 @@ def do_render_markdown(message: Message,
|
|||
sent_by_bot=sent_by_bot,
|
||||
translate_emoticons=translate_emoticons,
|
||||
mention_data=mention_data,
|
||||
email_gateway=email_gateway
|
||||
email_gateway=email_gateway,
|
||||
)
|
||||
return rendered_content
|
||||
|
||||
def huddle_users(recipient_id: int) -> str:
|
||||
display_recipient: DisplayRecipientT = get_display_recipient_by_id(
|
||||
recipient_id, Recipient.HUDDLE, None
|
||||
recipient_id, Recipient.HUDDLE, None,
|
||||
)
|
||||
|
||||
# str is for streams.
|
||||
|
@ -814,7 +814,7 @@ def get_inactive_recipient_ids(user_profile: UserProfile) -> List[int]:
|
|||
rows = get_stream_subscriptions_for_user(user_profile).filter(
|
||||
active=False,
|
||||
).values(
|
||||
'recipient_id'
|
||||
'recipient_id',
|
||||
)
|
||||
inactive_recipient_ids = [
|
||||
row['recipient_id']
|
||||
|
@ -826,7 +826,7 @@ def get_muted_stream_ids(user_profile: UserProfile) -> List[int]:
|
|||
active=True,
|
||||
is_muted=True,
|
||||
).values(
|
||||
'recipient__type_id'
|
||||
'recipient__type_id',
|
||||
)
|
||||
muted_stream_ids = [
|
||||
row['recipient__type_id']
|
||||
|
@ -837,9 +837,9 @@ def get_starred_message_ids(user_profile: UserProfile) -> List[int]:
|
|||
return list(UserMessage.objects.filter(
|
||||
user_profile=user_profile,
|
||||
).extra(
|
||||
where=[UserMessage.where_starred()]
|
||||
where=[UserMessage.where_starred()],
|
||||
).order_by(
|
||||
'message_id'
|
||||
'message_id',
|
||||
).values_list('message_id', flat=True)[0:10000])
|
||||
|
||||
def get_raw_unread_data(user_profile: UserProfile) -> RawUnreadMessagesResult:
|
||||
|
@ -847,11 +847,11 @@ def get_raw_unread_data(user_profile: UserProfile) -> RawUnreadMessagesResult:
|
|||
excluded_recipient_ids = get_inactive_recipient_ids(user_profile)
|
||||
|
||||
user_msgs = UserMessage.objects.filter(
|
||||
user_profile=user_profile
|
||||
user_profile=user_profile,
|
||||
).exclude(
|
||||
message__recipient_id__in=excluded_recipient_ids
|
||||
message__recipient_id__in=excluded_recipient_ids,
|
||||
).extra(
|
||||
where=[UserMessage.where_unread()]
|
||||
where=[UserMessage.where_unread()],
|
||||
).values(
|
||||
'message_id',
|
||||
'message__sender_id',
|
||||
|
|
|
@ -32,7 +32,7 @@ def setup_realm_internal_bots(realm: Realm) -> None:
|
|||
bots = UserProfile.objects.filter(
|
||||
realm=realm,
|
||||
email__in=[bot_info[1] for bot_info in internal_bots],
|
||||
bot_owner__isnull=True
|
||||
bot_owner__isnull=True,
|
||||
)
|
||||
for bot in bots:
|
||||
bot.bot_owner = bot
|
||||
|
@ -147,7 +147,7 @@ def send_initial_realm_messages(realm: Realm) -> None:
|
|||
]
|
||||
|
||||
messages = [internal_prep_stream_message_by_name(
|
||||
realm, welcome_bot, message['stream'], message['topic'], message['content']
|
||||
realm, welcome_bot, message['stream'], message['topic'], message['content'],
|
||||
) for message in welcome_messages]
|
||||
message_ids = do_send_messages(messages)
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ class GenericOutgoingWebhookService(OutgoingWebhookServiceInterface):
|
|||
event['message'],
|
||||
apply_markdown=False,
|
||||
client_gravatar=False,
|
||||
keep_rendered_content=True
|
||||
keep_rendered_content=True,
|
||||
)
|
||||
|
||||
request_data = {"data": event['command'],
|
||||
|
@ -325,7 +325,7 @@ def do_rest_call(base_url: str,
|
|||
except requests.exceptions.RequestException as e:
|
||||
response_message = ("An exception of type *%s* occurred for message `%s`! "
|
||||
"See the Zulip server logs for more information." % (
|
||||
type(e).__name__, event["command"],))
|
||||
type(e).__name__, event["command"]))
|
||||
logging.exception(f"Outhook trigger failed:\n {e}")
|
||||
fail_with_message(event, response_message)
|
||||
notify_bot_owner(event, exception=e)
|
||||
|
|
|
@ -28,7 +28,7 @@ def get_status_dicts_for_rows(all_rows: List[Dict[str, Any]],
|
|||
# here prevents us from having to assume the caller is playing nice.
|
||||
all_rows = sorted(
|
||||
all_rows,
|
||||
key = lambda row: (row['user_profile__id'], row['timestamp'])
|
||||
key = lambda row: (row['user_profile__id'], row['timestamp']),
|
||||
)
|
||||
|
||||
if slim_presence:
|
||||
|
@ -164,10 +164,10 @@ def get_status_dict_by_realm(realm_id: int, slim_presence: bool = False) -> Dict
|
|||
presence_rows = list(query)
|
||||
|
||||
mobile_query = PushDeviceToken.objects.distinct(
|
||||
'user_id'
|
||||
'user_id',
|
||||
).values_list(
|
||||
'user_id',
|
||||
flat=True
|
||||
flat=True,
|
||||
)
|
||||
|
||||
user_profile_ids = [presence_row['user_profile__id'] for presence_row in presence_rows]
|
||||
|
@ -183,7 +183,7 @@ def get_status_dict_by_realm(realm_id: int, slim_presence: bool = False) -> Dict
|
|||
mobile_query = query_for_ids(
|
||||
query=mobile_query,
|
||||
user_ids=user_profile_ids,
|
||||
field='user_id'
|
||||
field='user_id',
|
||||
)
|
||||
mobile_user_ids = set(mobile_query)
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ class RateLimitedObject(ABC):
|
|||
entity=self,
|
||||
secs_to_freedom=time,
|
||||
remaining=0,
|
||||
over_limit=ratelimited
|
||||
over_limit=ratelimited,
|
||||
))
|
||||
# Abort this request if the user is over their rate limits
|
||||
if ratelimited:
|
||||
|
@ -95,7 +95,7 @@ class RateLimitedObject(ABC):
|
|||
for "no rules".
|
||||
"""
|
||||
rules_list = self.rules()
|
||||
return rules_list or [(1, 9999), ]
|
||||
return rules_list or [(1, 9999)]
|
||||
|
||||
@abstractmethod
|
||||
def key(self) -> str:
|
||||
|
|
|
@ -42,7 +42,7 @@ def put_dict_in_redis(redis_client: redis.StrictRedis, key_format: str,
|
|||
|
||||
return key
|
||||
|
||||
def get_dict_from_redis(redis_client: redis.StrictRedis, key_format: str, key: str
|
||||
def get_dict_from_redis(redis_client: redis.StrictRedis, key_format: str, key: str,
|
||||
) -> Optional[Dict[str, Any]]:
|
||||
# This function requires inputting the intended key_format to validate
|
||||
# that the key fits it, as an additionally security measure. This protects
|
||||
|
|
|
@ -27,19 +27,19 @@ models_with_message_key: List[Dict[str, Any]] = [
|
|||
'class': Reaction,
|
||||
'archive_class': ArchivedReaction,
|
||||
'table_name': 'zerver_reaction',
|
||||
'archive_table_name': 'zerver_archivedreaction'
|
||||
'archive_table_name': 'zerver_archivedreaction',
|
||||
},
|
||||
{
|
||||
'class': SubMessage,
|
||||
'archive_class': ArchivedSubMessage,
|
||||
'table_name': 'zerver_submessage',
|
||||
'archive_table_name': 'zerver_archivedsubmessage'
|
||||
'archive_table_name': 'zerver_archivedsubmessage',
|
||||
},
|
||||
{
|
||||
'class': UserMessage,
|
||||
'archive_class': ArchivedUserMessage,
|
||||
'table_name': 'zerver_usermessage',
|
||||
'archive_table_name': 'zerver_archivedusermessage'
|
||||
'archive_table_name': 'zerver_archivedusermessage',
|
||||
},
|
||||
]
|
||||
|
||||
|
@ -68,7 +68,7 @@ def move_rows(
|
|||
sql_args.update(kwargs)
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute(
|
||||
raw_query.format(**sql_args)
|
||||
raw_query.format(**sql_args),
|
||||
)
|
||||
if returning_id:
|
||||
return [id for (id,) in cursor.fetchall()] # return list of row ids
|
||||
|
@ -153,7 +153,7 @@ def move_expired_messages_to_archive_by_recipient(recipient: Recipient,
|
|||
)
|
||||
|
||||
def move_expired_personal_and_huddle_messages_to_archive(realm: Realm,
|
||||
chunk_size: int=MESSAGE_BATCH_SIZE
|
||||
chunk_size: int=MESSAGE_BATCH_SIZE,
|
||||
) -> int:
|
||||
# This function will archive appropriate messages and their related objects.
|
||||
cross_realm_bot_ids = [
|
||||
|
@ -324,7 +324,7 @@ def archive_stream_messages(realm: Realm, streams: List[Stream], chunk_size: int
|
|||
message_count = 0
|
||||
for recipient in recipients:
|
||||
message_count += archive_messages_by_recipient(
|
||||
recipient, retention_policy_dict[recipient.type_id], realm, chunk_size
|
||||
recipient, retention_policy_dict[recipient.type_id], realm, chunk_size,
|
||||
)
|
||||
|
||||
logger.info("Done. Archived %s messages.", message_count)
|
||||
|
@ -521,7 +521,7 @@ def restore_all_data_from_archive(restore_manual_transactions: bool=True) -> Non
|
|||
|
||||
if restore_manual_transactions:
|
||||
restore_data_from_archive_by_transactions(
|
||||
ArchiveTransaction.objects.exclude(restored=True).filter(type=ArchiveTransaction.MANUAL)
|
||||
ArchiveTransaction.objects.exclude(restored=True).filter(type=ArchiveTransaction.MANUAL),
|
||||
)
|
||||
|
||||
def clean_archived_data() -> None:
|
||||
|
|
|
@ -59,7 +59,7 @@ class FromAddress:
|
|||
def build_email(template_prefix: str, to_user_ids: Optional[List[int]]=None,
|
||||
to_emails: Optional[List[str]]=None, from_name: Optional[str]=None,
|
||||
from_address: Optional[str]=None, reply_to_email: Optional[str]=None,
|
||||
language: Optional[str]=None, context: Optional[Dict[str, Any]]=None
|
||||
language: Optional[str]=None, context: Optional[Dict[str, Any]]=None,
|
||||
) -> EmailMultiAlternatives:
|
||||
# Callers should pass exactly one of to_user_id and to_email.
|
||||
assert (to_user_ids is None) ^ (to_emails is None)
|
||||
|
|
|
@ -228,7 +228,7 @@ def do_soft_deactivate_users(users: List[UserProfile]) -> List[UserProfile]:
|
|||
realm=user.realm,
|
||||
modified_user=user,
|
||||
event_type=RealmAuditLog.USER_SOFT_DEACTIVATED,
|
||||
event_time=event_time
|
||||
event_time=event_time,
|
||||
)
|
||||
realm_logs.append(log)
|
||||
users_soft_deactivated.append(user)
|
||||
|
@ -265,7 +265,7 @@ def reactivate_user_if_soft_deactivated(user_profile: UserProfile) -> Union[User
|
|||
realm=user_profile.realm,
|
||||
modified_user=user_profile,
|
||||
event_type=RealmAuditLog.USER_SOFT_ACTIVATED,
|
||||
event_time=timezone_now()
|
||||
event_time=timezone_now(),
|
||||
)
|
||||
logger.info('Soft Reactivated user %s', user_profile.id)
|
||||
return user_profile
|
||||
|
@ -309,6 +309,6 @@ def get_soft_deactivated_users_for_catch_up(filter_kwargs: Any) -> List[UserProf
|
|||
long_term_idle=True,
|
||||
is_active=True,
|
||||
is_bot=False,
|
||||
**filter_kwargs
|
||||
**filter_kwargs,
|
||||
)
|
||||
return users_to_catch_up
|
||||
|
|
|
@ -21,7 +21,7 @@ def get_active_subscriptions_for_stream_ids(stream_ids: List[int]) -> QuerySet:
|
|||
return Subscription.objects.filter(
|
||||
recipient__type=Recipient.STREAM,
|
||||
recipient__type_id__in=stream_ids,
|
||||
active=True
|
||||
active=True,
|
||||
)
|
||||
|
||||
def get_subscribed_stream_ids_for_user(user_profile: UserProfile) -> QuerySet:
|
||||
|
|
|
@ -18,7 +18,7 @@ from django.db.models.query import QuerySet
|
|||
def get_default_value_for_history_public_to_subscribers(
|
||||
realm: Realm,
|
||||
invite_only: bool,
|
||||
history_public_to_subscribers: Optional[bool]
|
||||
history_public_to_subscribers: Optional[bool],
|
||||
) -> bool:
|
||||
if invite_only:
|
||||
if history_public_to_subscribers is None:
|
||||
|
@ -63,8 +63,8 @@ def create_stream_if_needed(realm: Realm,
|
|||
invite_only=invite_only,
|
||||
stream_post_policy=stream_post_policy,
|
||||
history_public_to_subscribers=history_public_to_subscribers,
|
||||
is_in_zephyr_realm=realm.is_zephyr_mirror_realm
|
||||
)
|
||||
is_in_zephyr_realm=realm.is_zephyr_mirror_realm,
|
||||
),
|
||||
)
|
||||
|
||||
if created:
|
||||
|
@ -95,7 +95,7 @@ def create_streams_if_needed(realm: Realm,
|
|||
invite_only=stream_dict.get("invite_only", False),
|
||||
stream_post_policy=stream_dict.get("stream_post_policy", Stream.STREAM_POST_POLICY_EVERYONE),
|
||||
history_public_to_subscribers=stream_dict.get("history_public_to_subscribers"),
|
||||
stream_description=stream_dict.get("description", "")
|
||||
stream_description=stream_dict.get("description", ""),
|
||||
)
|
||||
|
||||
if created:
|
||||
|
|
|
@ -34,7 +34,7 @@ from zerver.lib.actions import (
|
|||
)
|
||||
from zerver.lib.streams import (
|
||||
create_stream_if_needed,
|
||||
get_default_value_for_history_public_to_subscribers
|
||||
get_default_value_for_history_public_to_subscribers,
|
||||
)
|
||||
from zerver.lib.stream_subscription import (
|
||||
get_stream_subscriptions_for_user,
|
||||
|
@ -61,7 +61,7 @@ from zerver.models import (
|
|||
Stream,
|
||||
Subscription,
|
||||
UserProfile,
|
||||
get_realm_stream
|
||||
get_realm_stream,
|
||||
)
|
||||
from zilencer.models import get_remote_server_by_uuid
|
||||
from zerver.decorator import do_two_factor_login
|
||||
|
@ -251,7 +251,7 @@ class ZulipTestCase(TestCase):
|
|||
webhook_bot='webhook-bot@zulip.com',
|
||||
welcome_bot='welcome-bot@zulip.com',
|
||||
outgoing_webhook_bot='outgoing-webhook@zulip.com',
|
||||
default_bot='default-bot@zulip.com'
|
||||
default_bot='default-bot@zulip.com',
|
||||
)
|
||||
|
||||
mit_user_map = dict(
|
||||
|
@ -262,7 +262,7 @@ class ZulipTestCase(TestCase):
|
|||
|
||||
lear_user_map = dict(
|
||||
cordelia="cordelia@zulip.com",
|
||||
king="king@lear.org"
|
||||
king="king@lear.org",
|
||||
)
|
||||
|
||||
# Non-registered test users
|
||||
|
@ -367,7 +367,7 @@ class ZulipTestCase(TestCase):
|
|||
username=email,
|
||||
password=password,
|
||||
realm=realm,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
def assert_login_failure(self,
|
||||
|
@ -379,7 +379,7 @@ class ZulipTestCase(TestCase):
|
|||
username=email,
|
||||
password=password,
|
||||
realm=realm,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
def login_user(self, user_profile: UserProfile) -> None:
|
||||
|
@ -530,7 +530,7 @@ class ZulipTestCase(TestCase):
|
|||
|
||||
return check_send_message(
|
||||
from_user, sending_client, 'private', recipient_list, None,
|
||||
content
|
||||
content,
|
||||
)
|
||||
|
||||
def send_huddle_message(self,
|
||||
|
@ -545,7 +545,7 @@ class ZulipTestCase(TestCase):
|
|||
|
||||
return check_send_message(
|
||||
from_user, sending_client, 'private', to_user_ids, None,
|
||||
content
|
||||
content,
|
||||
)
|
||||
|
||||
def send_stream_message(self, sender: UserProfile, stream_name: str, content: str="test content",
|
||||
|
@ -663,14 +663,14 @@ class ZulipTestCase(TestCase):
|
|||
def webhook_fixture_data(self, type: str, action: str, file_type: str='json') -> str:
|
||||
fn = os.path.join(
|
||||
os.path.dirname(__file__),
|
||||
f"../webhooks/{type}/fixtures/{action}.{file_type}"
|
||||
f"../webhooks/{type}/fixtures/{action}.{file_type}",
|
||||
)
|
||||
return open(fn).read()
|
||||
|
||||
def fixture_file_name(self, file_name: str, type: str='') -> str:
|
||||
return os.path.join(
|
||||
os.path.dirname(__file__),
|
||||
f"../tests/fixtures/{type}/{file_name}"
|
||||
f"../tests/fixtures/{type}/{file_name}",
|
||||
)
|
||||
|
||||
def fixture_data(self, file_name: str, type: str='') -> str:
|
||||
|
@ -840,7 +840,7 @@ class ZulipTestCase(TestCase):
|
|||
for dn, attrs in directory.items():
|
||||
if 'uid' in attrs:
|
||||
# Generate a password for the ldap account:
|
||||
attrs['userPassword'] = [self.ldap_password(attrs['uid'][0]), ]
|
||||
attrs['userPassword'] = [self.ldap_password(attrs['uid'][0])]
|
||||
|
||||
# Load binary attributes. If in "directory", an attribute as its value
|
||||
# has a string starting with "file:", the rest of the string is assumed
|
||||
|
@ -849,7 +849,7 @@ class ZulipTestCase(TestCase):
|
|||
for attr, value in attrs.items():
|
||||
if isinstance(value, str) and value.startswith("file:"):
|
||||
with open(value[5:], 'rb') as f:
|
||||
attrs[attr] = [f.read(), ]
|
||||
attrs[attr] = [f.read()]
|
||||
|
||||
ldap_patcher = mock.patch('django_auth_ldap.config.ldap.initialize')
|
||||
self.mock_initialize = ldap_patcher.start()
|
||||
|
@ -873,7 +873,7 @@ class ZulipTestCase(TestCase):
|
|||
else:
|
||||
data = attr_value
|
||||
|
||||
self.mock_ldap.directory[dn][attr_name] = [data, ]
|
||||
self.mock_ldap.directory[dn][attr_name] = [data]
|
||||
|
||||
def ldap_username(self, username: str) -> str:
|
||||
"""
|
||||
|
|
|
@ -69,7 +69,7 @@ class Database:
|
|||
self.migration_status_file = 'migration_status_' + platform
|
||||
self.migration_status_path = os.path.join(
|
||||
UUID_VAR_DIR,
|
||||
self.migration_status_file
|
||||
self.migration_status_file,
|
||||
)
|
||||
self.migration_digest_file = "migrations_hash_" + database_name
|
||||
|
||||
|
@ -290,7 +290,7 @@ def get_migration_status(**options: Any) -> str:
|
|||
app_label = options['app_label'] if options.get('app_label') else None
|
||||
db = options.get('database', DEFAULT_DB_ALIAS)
|
||||
out = StringIO()
|
||||
command_args = ['--list', ]
|
||||
command_args = ['--list']
|
||||
if app_label:
|
||||
command_args.append(app_label)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from contextlib import contextmanager
|
||||
from typing import (
|
||||
Any, Callable, Dict, Generator, Iterable, Iterator, List, Mapping,
|
||||
Optional, Tuple, Union, IO, TypeVar, TYPE_CHECKING
|
||||
Optional, Tuple, Union, IO, TypeVar, TYPE_CHECKING,
|
||||
)
|
||||
|
||||
from django.urls import URLResolver
|
||||
|
@ -555,7 +555,7 @@ def use_db_models(method: Callable[..., None]) -> Callable[..., None]: # nocove
|
|||
UserHotspot=UserHotspot,
|
||||
UserMessage=UserMessage,
|
||||
UserPresence=UserPresence,
|
||||
UserProfile=UserProfile
|
||||
UserProfile=UserProfile,
|
||||
)
|
||||
zerver_test_helpers_patch = mock.patch.multiple(
|
||||
'zerver.lib.test_helpers',
|
||||
|
|
|
@ -21,7 +21,7 @@ from zerver.lib.rate_limiter import bounce_redis_key_prefix_for_testing
|
|||
from zerver.lib.sqlalchemy_utils import get_sqlalchemy_connection
|
||||
from zerver.lib.test_helpers import (
|
||||
write_instrumentation_reports,
|
||||
append_instrumentation_data
|
||||
append_instrumentation_data,
|
||||
)
|
||||
|
||||
import os
|
||||
|
|
|
@ -12,7 +12,7 @@ ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__f
|
|||
sys.path.append(ZULIP_PATH)
|
||||
|
||||
from zthumbor.loaders.helpers import (
|
||||
THUMBOR_S3_TYPE, THUMBOR_LOCAL_FILE_TYPE, THUMBOR_EXTERNAL_TYPE
|
||||
THUMBOR_S3_TYPE, THUMBOR_LOCAL_FILE_TYPE, THUMBOR_EXTERNAL_TYPE,
|
||||
)
|
||||
from zerver.lib.camo import get_camo_url
|
||||
|
||||
|
@ -63,7 +63,7 @@ def generate_thumbnail_url(path: str,
|
|||
height=height,
|
||||
smart=smart_crop_enabled,
|
||||
filters=apply_filters,
|
||||
image_url=image_url
|
||||
image_url=image_url,
|
||||
)
|
||||
|
||||
if settings.THUMBOR_URL == 'http://127.0.0.1:9995':
|
||||
|
|
|
@ -165,7 +165,7 @@ def generate_topic_history_from_db_rows(rows: List[Tuple[str, int]]) -> List[Dic
|
|||
for canonical_topic, (max_message_id, topic_name) in canonical_topic_names.items():
|
||||
history.append(dict(
|
||||
name=topic_name,
|
||||
max_id=max_message_id)
|
||||
max_id=max_message_id),
|
||||
)
|
||||
return sorted(history, key=lambda x: -x['max_id'])
|
||||
|
||||
|
|
|
@ -8,14 +8,14 @@ from zerver.lib.timestamp import datetime_to_timestamp
|
|||
from zerver.models import (
|
||||
get_stream,
|
||||
MutedTopic,
|
||||
UserProfile
|
||||
UserProfile,
|
||||
)
|
||||
from sqlalchemy.sql import (
|
||||
and_,
|
||||
column,
|
||||
not_,
|
||||
or_,
|
||||
Selectable
|
||||
Selectable,
|
||||
)
|
||||
|
||||
from django.utils.timezone import now as timezone_now
|
||||
|
@ -26,7 +26,7 @@ def get_topic_mutes(user_profile: UserProfile) -> List[List[Union[str, float]]]:
|
|||
).values(
|
||||
'stream__name',
|
||||
'topic_name',
|
||||
'date_muted'
|
||||
'date_muted',
|
||||
)
|
||||
return [
|
||||
[row['stream__name'], row['topic_name'], datetime_to_timestamp(row['date_muted'])]
|
||||
|
@ -73,7 +73,7 @@ def remove_topic_mute(user_profile: UserProfile, stream_id: int, topic_name: str
|
|||
row = MutedTopic.objects.get(
|
||||
user_profile=user_profile,
|
||||
stream_id=stream_id,
|
||||
topic_name__iexact=topic_name
|
||||
topic_name__iexact=topic_name,
|
||||
)
|
||||
row.delete()
|
||||
|
||||
|
@ -99,7 +99,7 @@ def exclude_topic_mutes(conditions: List[Selectable],
|
|||
|
||||
query = query.values(
|
||||
'recipient_id',
|
||||
'topic_name'
|
||||
'topic_name',
|
||||
)
|
||||
rows = list(query)
|
||||
|
||||
|
@ -121,7 +121,7 @@ def build_topic_mute_checker(user_profile: UserProfile) -> Callable[[int, str],
|
|||
user_profile=user_profile,
|
||||
).values(
|
||||
'recipient_id',
|
||||
'topic_name'
|
||||
'topic_name',
|
||||
)
|
||||
rows = list(rows)
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ def transfer_emoji_to_s3(processes: int) -> None:
|
|||
return 0 # nocoverage
|
||||
emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(
|
||||
realm_id=realm_emoji.realm.id,
|
||||
emoji_file_name=realm_emoji.file_name
|
||||
emoji_file_name=realm_emoji.file_name,
|
||||
)
|
||||
emoji_path = os.path.join(settings.LOCAL_UPLOADS_DIR, "avatars", emoji_path) + ".original"
|
||||
try:
|
||||
|
|
|
@ -292,7 +292,7 @@ def upload_image_to_s3(
|
|||
key = bucket.Object(file_name)
|
||||
metadata = {
|
||||
"user_profile_id": str(user_profile.id),
|
||||
"realm_id": str(user_profile.realm_id)
|
||||
"realm_id": str(user_profile.realm_id),
|
||||
}
|
||||
|
||||
content_disposition = ''
|
||||
|
@ -378,7 +378,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
s3_file_name = "/".join([
|
||||
str(target_realm.id),
|
||||
random_name(18),
|
||||
sanitize_name(uploaded_file_name)
|
||||
sanitize_name(uploaded_file_name),
|
||||
])
|
||||
url = f"/user_uploads/{s3_file_name}"
|
||||
|
||||
|
@ -387,7 +387,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
s3_file_name,
|
||||
content_type,
|
||||
user_profile,
|
||||
file_data
|
||||
file_data,
|
||||
)
|
||||
|
||||
create_attachment(uploaded_file_name, s3_file_name, user_profile, uploaded_file_size)
|
||||
|
@ -415,7 +415,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
s3_file_name + "-medium.png",
|
||||
"image/png",
|
||||
target_user_profile,
|
||||
resized_medium
|
||||
resized_medium,
|
||||
)
|
||||
|
||||
resized_data = resize_avatar(image_data)
|
||||
|
@ -565,7 +565,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
s3_file_name + "-medium.png",
|
||||
"image/png",
|
||||
user_profile,
|
||||
resized_medium
|
||||
resized_medium,
|
||||
)
|
||||
|
||||
def ensure_basic_avatar_image(self, user_profile: UserProfile) -> None: # nocoverage
|
||||
|
@ -585,7 +585,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
s3_file_name,
|
||||
"image/png",
|
||||
user_profile,
|
||||
resized_avatar
|
||||
resized_avatar,
|
||||
)
|
||||
|
||||
def upload_emoji_image(self, emoji_file: File, emoji_file_name: str,
|
||||
|
@ -594,7 +594,7 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
bucket_name = settings.S3_AVATAR_BUCKET
|
||||
emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(
|
||||
realm_id=user_profile.realm_id,
|
||||
emoji_file_name=emoji_file_name
|
||||
emoji_file_name=emoji_file_name,
|
||||
)
|
||||
|
||||
image_data = emoji_file.read()
|
||||
|
@ -640,9 +640,9 @@ class S3UploadBackend(ZulipUploadBackend):
|
|||
'get_object',
|
||||
Params={
|
||||
'Bucket': bucket.name,
|
||||
'Key': key.key
|
||||
'Key': key.key,
|
||||
},
|
||||
ExpiresIn=0
|
||||
ExpiresIn=0,
|
||||
)
|
||||
return public_url
|
||||
|
||||
|
@ -710,7 +710,7 @@ class LocalUploadBackend(ZulipUploadBackend):
|
|||
str(user_profile.realm_id),
|
||||
format(random.randint(0, 255), 'x'),
|
||||
random_name(18),
|
||||
sanitize_name(uploaded_file_name)
|
||||
sanitize_name(uploaded_file_name),
|
||||
])
|
||||
|
||||
write_local_file('files', path, file_data)
|
||||
|
@ -832,7 +832,7 @@ class LocalUploadBackend(ZulipUploadBackend):
|
|||
user_profile: UserProfile) -> None:
|
||||
emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(
|
||||
realm_id= user_profile.realm_id,
|
||||
emoji_file_name=emoji_file_name
|
||||
emoji_file_name=emoji_file_name,
|
||||
)
|
||||
|
||||
image_data = emoji_file.read()
|
||||
|
|
|
@ -13,7 +13,7 @@ def get_user_info_dict(realm_id: int) -> Dict[int, Dict[str, Any]]:
|
|||
user_profile__is_active=True,
|
||||
).exclude(
|
||||
Q(status=UserStatus.NORMAL) &
|
||||
Q(status_text='')
|
||||
Q(status_text=''),
|
||||
).values(
|
||||
'user_profile_id',
|
||||
'status',
|
||||
|
|
|
@ -181,7 +181,7 @@ def user_ids_to_users(user_ids: List[int], realm: Realm) -> List[UserProfile]:
|
|||
user_profiles_by_id: Dict[int, UserProfile] = generic_bulk_cached_fetch(
|
||||
cache_key_function=user_profile_by_id_cache_key,
|
||||
query_function=fetch_users_by_id,
|
||||
object_ids=user_ids
|
||||
object_ids=user_ids,
|
||||
)
|
||||
|
||||
found_user_ids = user_profiles_by_id.keys()
|
||||
|
@ -307,7 +307,7 @@ def format_user_row(realm: Realm, acting_user: UserProfile, row: Dict[str, Any],
|
|||
avatar_source=row['avatar_source'],
|
||||
avatar_version=row['avatar_version'],
|
||||
medium=False,
|
||||
client_gravatar=client_gravatar,)
|
||||
client_gravatar=client_gravatar)
|
||||
|
||||
is_admin = is_administrator_role(row['role'])
|
||||
is_owner = row['role'] == UserProfile.ROLE_REALM_OWNER
|
||||
|
@ -398,11 +398,11 @@ def get_custom_profile_field_values(custom_profile_field_values:
|
|||
if profile_field.field.is_renderable():
|
||||
profiles_by_user_id[user_id][profile_field.field_id] = {
|
||||
"value": profile_field.value,
|
||||
"rendered_value": profile_field.rendered_value
|
||||
"rendered_value": profile_field.rendered_value,
|
||||
}
|
||||
else:
|
||||
profiles_by_user_id[user_id][profile_field.field_id] = {
|
||||
"value": profile_field.value
|
||||
"value": profile_field.value,
|
||||
}
|
||||
return profiles_by_user_id
|
||||
|
||||
|
@ -440,6 +440,6 @@ def get_raw_user_data(realm: Realm, acting_user: UserProfile, client_gravatar: b
|
|||
acting_user = acting_user,
|
||||
row=row,
|
||||
client_gravatar= client_gravatar,
|
||||
custom_profile_field_data = custom_profile_field_data
|
||||
custom_profile_field_data = custom_profile_field_data,
|
||||
)
|
||||
return result
|
||||
|
|
|
@ -36,7 +36,7 @@ def notify_bot_owner_about_invalid_json(user_profile: UserProfile,
|
|||
webhook_client_name: str) -> None:
|
||||
send_rate_limited_pm_notification_to_bot_owner(
|
||||
user_profile, user_profile.realm,
|
||||
INVALID_JSON_MESSAGE.format(webhook_name=webhook_client_name).strip()
|
||||
INVALID_JSON_MESSAGE.format(webhook_name=webhook_client_name).strip(),
|
||||
)
|
||||
|
||||
class MissingHTTPEventHeader(JsonableError):
|
||||
|
@ -55,7 +55,7 @@ def check_send_webhook_message(
|
|||
request: HttpRequest, user_profile: UserProfile,
|
||||
topic: str, body: str, stream: Optional[str]=REQ(default=None),
|
||||
user_specified_topic: Optional[str]=REQ("topic", default=None),
|
||||
unquote_url_parameters: Optional[bool]=False
|
||||
unquote_url_parameters: Optional[bool]=False,
|
||||
) -> None:
|
||||
|
||||
if stream is None:
|
||||
|
|
|
@ -62,14 +62,14 @@ def get_push_commits_event_message(user_name: str, compare_url: Optional[str],
|
|||
return PUSH_DELETE_BRANCH_MESSAGE_TEMPLATE.format(
|
||||
user_name=user_name,
|
||||
compare_url=compare_url,
|
||||
branch_name=branch_name
|
||||
branch_name=branch_name,
|
||||
)
|
||||
|
||||
if not commits_data and not deleted:
|
||||
return PUSH_LOCAL_BRANCH_WITHOUT_COMMITS_MESSAGE_TEMPLATE.format(
|
||||
user_name=user_name,
|
||||
compare_url=compare_url,
|
||||
branch_name=branch_name
|
||||
branch_name=branch_name,
|
||||
)
|
||||
|
||||
pushed_message_template = PUSH_PUSHED_TEXT_WITH_URL if compare_url else PUSH_PUSHED_TEXT_WITHOUT_URL
|
||||
|
@ -109,7 +109,7 @@ def get_force_push_commits_event_message(user_name: str, url: str, branch_name:
|
|||
user_name=user_name,
|
||||
url=url,
|
||||
branch_name=branch_name,
|
||||
head=head
|
||||
head=head,
|
||||
)
|
||||
|
||||
def get_create_branch_event_message(user_name: str, url: Optional[str], branch_name: str) -> str:
|
||||
|
@ -172,7 +172,7 @@ def get_pull_request_event_message(user_name: str, action: str, url: str, number
|
|||
if target_branch and base_branch:
|
||||
branch_info = PULL_REQUEST_BRANCH_INFO_TEMPLATE.format(
|
||||
target=target_branch,
|
||||
base=base_branch
|
||||
base=base_branch,
|
||||
)
|
||||
main_message = f"{main_message} {branch_info}"
|
||||
|
||||
|
@ -228,7 +228,7 @@ def get_push_tag_event_message(user_name: str,
|
|||
message = PUSH_TAGS_MESSAGE_TEMPLATE.format(
|
||||
user_name=user_name,
|
||||
action=action,
|
||||
tag=tag_part
|
||||
tag=tag_part,
|
||||
)
|
||||
|
||||
if tag_name[-1] not in string.punctuation:
|
||||
|
@ -245,13 +245,13 @@ def get_commits_comment_action_message(user_name: str,
|
|||
user_name=user_name,
|
||||
action=action,
|
||||
sha=get_short_sha(sha),
|
||||
url=commit_url
|
||||
url=commit_url,
|
||||
)
|
||||
punctuation = ':' if message else '.'
|
||||
content = f'{content}{punctuation}'
|
||||
if message:
|
||||
content += CONTENT_MESSAGE_TEMPLATE.format(
|
||||
message=message
|
||||
message=message,
|
||||
)
|
||||
|
||||
return content
|
||||
|
@ -262,16 +262,16 @@ def get_commits_content(commits_data: List[Dict[str, Any]], is_truncated: Option
|
|||
commits_content += COMMIT_ROW_TEMPLATE.format(
|
||||
commit_short_sha=get_short_sha(commit['sha']),
|
||||
commit_url=commit.get('url'),
|
||||
commit_msg=commit['message'].partition('\n')[0]
|
||||
commit_msg=commit['message'].partition('\n')[0],
|
||||
)
|
||||
|
||||
if len(commits_data) > COMMITS_LIMIT:
|
||||
commits_content += COMMITS_MORE_THAN_LIMIT_TEMPLATE.format(
|
||||
commits_number=len(commits_data) - COMMITS_LIMIT
|
||||
commits_number=len(commits_data) - COMMITS_LIMIT,
|
||||
)
|
||||
elif is_truncated:
|
||||
commits_content += COMMITS_MORE_THAN_LIMIT_TEMPLATE.format(
|
||||
commits_number=''
|
||||
commits_number='',
|
||||
).replace(' ', ' ')
|
||||
return commits_content.rstrip()
|
||||
|
||||
|
@ -282,7 +282,7 @@ def get_release_event_message(user_name: str, action: str,
|
|||
action=action,
|
||||
tagname=tagname,
|
||||
release_name=release_name,
|
||||
url=url
|
||||
url=url,
|
||||
)
|
||||
|
||||
return content
|
||||
|
@ -298,7 +298,7 @@ def get_all_committers(commits_data: List[Dict[str, Any]]) -> List[Tuple[str, in
|
|||
|
||||
# Sort by commit count, breaking ties alphabetically.
|
||||
committers_items: List[Tuple[str, int]] = sorted(
|
||||
list(committers.items()), key=lambda item: (-item[1], item[0])
|
||||
list(committers.items()), key=lambda item: (-item[1], item[0]),
|
||||
)
|
||||
committers_values: List[int] = [c_i[1] for c_i in committers_items]
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue