from core.models import *

def handle(user):
	from core.models import Deployment,SiteDeployments,UserDeployment
	from collections import defaultdict
	deployments = Deployment.objects.all()
	site_deployments = SiteDeployments.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()    

