mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	APNs apparently treats its tokens case-insensitively; FCM does not. Adjust the `unique_together` to instead be separate partial constraints, keyed on the `kind` of the PushDeviceToken.
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import django.db.models.functions.text
 | 
						|
from django.db import migrations, models
 | 
						|
 | 
						|
 | 
						|
class Migration(migrations.Migration):
 | 
						|
    dependencies = [
 | 
						|
        ("zerver", "0739_alter_realm_can_set_delete_message_policy_group"),
 | 
						|
    ]
 | 
						|
 | 
						|
    operations = [
 | 
						|
        # Update the last_updated to the max for any set of (user_id, kind=1, lower(token))
 | 
						|
        migrations.RunSQL(
 | 
						|
            """
 | 
						|
            WITH dups AS (
 | 
						|
              SELECT user_id, kind, LOWER(token) AS token, MAX(last_updated) AS max_last_updated
 | 
						|
                FROM zerver_pushdevicetoken
 | 
						|
               WHERE kind = 1
 | 
						|
               GROUP BY user_id, kind, LOWER(token)
 | 
						|
              HAVING COUNT(*) > 1
 | 
						|
            )
 | 
						|
            UPDATE zerver_pushdevicetoken
 | 
						|
               SET last_updated = dups.max_last_updated
 | 
						|
              FROM dups
 | 
						|
             WHERE zerver_pushdevicetoken.user_id = dups.user_id
 | 
						|
               AND zerver_pushdevicetoken.kind = dups.kind
 | 
						|
               AND LOWER(zerver_pushdevicetoken.token) = dups.token
 | 
						|
            """
 | 
						|
        ),
 | 
						|
        # And then delete all but the first of each of those sets
 | 
						|
        migrations.RunSQL(
 | 
						|
            """
 | 
						|
            WITH dups AS (
 | 
						|
              SELECT user_id, kind, LOWER(token) AS token, MIN(id) AS min_id
 | 
						|
                FROM zerver_pushdevicetoken
 | 
						|
               WHERE kind = 1
 | 
						|
               GROUP BY user_id, kind, LOWER(token)
 | 
						|
              HAVING COUNT(*) > 1
 | 
						|
            )
 | 
						|
            DELETE FROM zerver_pushdevicetoken
 | 
						|
             USING dups
 | 
						|
             WHERE zerver_pushdevicetoken.user_id = dups.user_id
 | 
						|
               AND zerver_pushdevicetoken.kind = dups.kind
 | 
						|
               AND LOWER(zerver_pushdevicetoken.token) = dups.token
 | 
						|
               AND zerver_pushdevicetoken.id != dups.min_id
 | 
						|
            """
 | 
						|
        ),
 | 
						|
        migrations.AddConstraint(
 | 
						|
            model_name="pushdevicetoken",
 | 
						|
            constraint=models.UniqueConstraint(
 | 
						|
                models.F("user_id"),
 | 
						|
                models.F("kind"),
 | 
						|
                django.db.models.functions.text.Lower(models.F("token")),
 | 
						|
                condition=models.Q(("kind", 1)),
 | 
						|
                name="zerver_pushdevicetoken_apns_user_kind_token",
 | 
						|
            ),
 | 
						|
        ),
 | 
						|
        migrations.AddConstraint(
 | 
						|
            model_name="pushdevicetoken",
 | 
						|
            constraint=models.UniqueConstraint(
 | 
						|
                models.F("user_id"),
 | 
						|
                models.F("kind"),
 | 
						|
                models.F("token"),
 | 
						|
                condition=models.Q(("kind", 2)),
 | 
						|
                name="zerver_pushdevicetoken_fcm_user_kind_token",
 | 
						|
            ),
 | 
						|
        ),
 | 
						|
        migrations.AlterUniqueTogether(
 | 
						|
            name="pushdevicetoken",
 | 
						|
            unique_together=set(),
 | 
						|
        ),
 | 
						|
    ]
 |