from core.models import *

def handle(user):
	from core.models import Deployment,SiteDeployment,UserDeployment
	from collections import defaultdict
	deployments = Deployment.objects.all()
	site_deployments = SiteDeployment.objects.all()
	site_deploy_lookup = defaultdict(list)
	for site_deployment in site_deployments:
		site_deploy_lookup[site_deployment.site].append(site_deployment.deployment)

	user_deploy_lookup = defaultdict(list)
	for user_deployment in UserDeployment.objects.all():
		user_deploy_lookup[user_deployment.user].append(user_deployment.deployment)
   
	all_deployments = Deployment.objects.filter() 
	if user.is_admin:
		# admins should have an account at all deployments
		expected_deployments = deployments
	else:
		# normal users should have an account at their site's deployments
		#expected_deployments = site_deploy_lookup[user.site]
		# users are added to all deployments for now
		expected_deployments = deployments        

	for expected_deployment in expected_deployments:
		if not user in user_deploy_lookup or \
		  expected_deployment not in user_deploy_lookup[user]: 
			# add new record
			ud = UserDeployment(user=user, deployment=expected_deployment)
			ud.save()    

