def render_all_stream_descriptions( apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: # FIXME: Application code should not be imported from migrations. from zerver.lib.streams import render_stream_description Stream = apps.get_model("zerver", "Stream") all_streams = Stream.objects.exclude(description="") for stream in all_streams: stream.rendered_description = render_stream_description( stream.description) stream.save(update_fields=["rendered_description"])
def bulk_create_streams( realm: Realm, stream_dict: Dict[str, Dict[str, Any]]) -> None: # nocoverage existing_streams = { name.lower() for name in Stream.objects.filter( realm=realm).values_list('name', flat=True) } streams_to_create: List[Stream] = [] for name, options in stream_dict.items(): if 'history_public_to_subscribers' not in options: options['history_public_to_subscribers'] = ( not options.get("invite_only", False) and not realm.is_zephyr_mirror_realm) if name.lower() not in existing_streams: streams_to_create.append( Stream( realm=realm, name=name, description=options["description"], rendered_description=render_stream_description( options["description"]), invite_only=options.get("invite_only", False), stream_post_policy=options.get( "stream_post_policy", Stream.STREAM_POST_POLICY_EVERYONE), 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. # This is required for test fixtures which contain `stream_id`. Prior # to python 3.3 hashes were not randomized but after a security fix # hash randomization was enabled in python 3.3 which made iteration # of dictionaries and sets completely unpredictable. Here the order # of elements while iterating `stream_dict` will be completely random # for python 3.3 and later versions. streams_to_create.sort(key=lambda x: x.name) Stream.objects.bulk_create(streams_to_create) recipients_to_create: List[Recipient] = [] for stream in Stream.objects.filter(realm=realm).values('id', 'name'): if stream['name'].lower() not in existing_streams: recipients_to_create.append( Recipient(type_id=stream['id'], type=Recipient.STREAM)) Recipient.objects.bulk_create(recipients_to_create) bulk_set_users_or_streams_recipient_fields(Stream, streams_to_create, recipients_to_create)
def do_change_stream_description( stream: Stream, new_description: str, *, acting_user: UserProfile ) -> None: old_description = stream.description with transaction.atomic(): stream.description = new_description stream.rendered_description = render_stream_description(new_description) stream.save(update_fields=["description", "rendered_description"]) RealmAuditLog.objects.create( realm=stream.realm, acting_user=acting_user, modified_stream=stream, event_type=RealmAuditLog.STREAM_PROPERTY_CHANGED, event_time=timezone_now(), extra_data=orjson.dumps( { RealmAuditLog.OLD_VALUE: old_description, RealmAuditLog.NEW_VALUE: new_description, "property": "description", } ).decode(), ) event = dict( type="stream", op="update", property="description", name=stream.name, stream_id=stream.id, value=new_description, rendered_description=stream.rendered_description, ) send_event(stream.realm, event, can_access_stream_user_ids(stream)) send_change_stream_description_notification( stream, old_description=old_description, new_description=new_description, acting_user=acting_user, )
def do_update_user_custom_profile_data_if_changed( user_profile: UserProfile, data: List[Dict[str, Union[int, ProfileDataElementValue]]], ) -> None: with transaction.atomic(): for custom_profile_field in data: field_value, created = CustomProfileFieldValue.objects.get_or_create( user_profile=user_profile, field_id=custom_profile_field["id"] ) # field_value.value is a TextField() so we need to have field["value"] # in string form to correctly make comparisons and assignments. if isinstance(custom_profile_field["value"], str): custom_profile_field_value_string = custom_profile_field["value"] else: custom_profile_field_value_string = orjson.dumps( custom_profile_field["value"] ).decode() if not created and field_value.value == custom_profile_field_value_string: # If the field value isn't actually being changed to a different one, # we have nothing to do here for this field. continue field_value.value = custom_profile_field_value_string if field_value.field.is_renderable(): field_value.rendered_value = render_stream_description( custom_profile_field_value_string ) field_value.save(update_fields=["value", "rendered_value"]) else: field_value.save(update_fields=["value"]) notify_user_update_custom_profile_data( user_profile, { "id": field_value.field_id, "value": field_value.value, "rendered_value": field_value.rendered_value, "type": field_value.field.field_type, }, )
def render_all_stream_descriptions(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: Stream = apps.get_model("zerver", "Stream") all_streams = Stream.objects.exclude(description="") for stream in all_streams: stream.rendered_description = render_stream_description(stream.description) stream.save(update_fields=["rendered_description"])