About User
Models.py
class Professor(models.Model):
"""
교수님 목록을 저장하는 모델입니다.
한번 저장된 교수님 성함은 절대로 삭제하면 안됩니다.
(교수님이 은퇴하신 이후에도 팀게시판에 접근할 수 있게 하기 위함입니다.)
activation 변수를 통해 안식년 혹은 은퇴를 판단합니다.
아직 동명이인 교수님에 대한 처리는 없습니다.
"""
name = models.CharField(max_length=50)
activation = models.BooleanField(default=True)
def __str__(self):
return self.name
class Profile(AbstractUser):
"""
유저의 정보를 담는 django.contrib.auth.User 모델 대신
AbstractUser를 상속받아 User로 인식하게 된 모델입니다.
추가적으로 유저의 정보를 담는 모델입니다.
유저의 정보인 User 모델에 있는 정보는 절대로 삭제되면 안되며,
이 Profile 역시 절대로 삭제되면 안됩니다.
유저가 탈퇴시 삭제 대신 User모델에 있는 is_active를 false로 설정합니다.
이후 개인정보보호정책에 의해 개인정보의 보유기간이 지난 이후 철저히 개인정보만을 삭제합니다.
이는 def_private_data 함수를 이용해 진행되며, 개인정보가 아닌 정보는 저장합니다.
"""
name = models.CharField(max_length=50)
nickname = models.CharField(max_length=10, unique=True)
student_id = models.IntegerField()
birthday = models.DateField(null=True, default=None)
allow_mailing = models.BooleanField(default=True)
first_major = models.CharField(max_length=100, null=True, blank=True)
second_major = models.CharField(max_length=100, null=True, blank=True)
thumbnail = models.ImageField(null=True, blank=True)
change_pw_latest_date = models.DateTimeField(auto_now=True)
auth_date = models.DateTimeField(auto_now_add=True)
objects = UserManager()
objects_in = InheritanceManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email', 'name', 'nickname', 'student_id']
def __str__(self):
return self.nickname
def is_student(self):
s_id = int(str(self.student_id)[:1])
if(s_id == 2):
return True
else:
return False
def get_student_id(self):
return int(str(self.student_id)[1:3])
def set_team(self, p_name):
time = timezone.now()
y = time.year
if time.month >= 2 and time.month < 6:
s = 1
elif time.month >= 7 and time.month < 12:
s = 2
else:
return False
t = Team(year=y, semester=s, professor=Professor.objects.get(name=p_name), member=self)
t.save()
return t
def del_private_data(self):
self.user.email = None
self.user.first_name = None
self.user.last_name = None
self.name = "Deleted"
self.student_id = 0
self.birthday = None
self.team = None
self.save()
return self
class Team(models.Model):
"""
팀 목록을 저장하는 모델입니다.
각 유저마다 각각의 로그가 생성됩니다.
"""
year = models.IntegerField()
semester = models.IntegerField()
name = models.CharField(max_length=50, null=True, default=None)
professor = models.OneToOneField(Professor)
member = models.ForeignKey(Profile, on_delete=models.CASCADE)
def __str__(self):
return self.professor.name + "교수님 팀"
Settings.py
...
기존 settings.py 내용들
...
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "your client id"
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "your client secret"
SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
'social.pipeline.user.get_username',
'base.social.customize_user_data',
'base.social.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details'
)
SOCIAL_AUTH_URL_NAMESPACE = 'social'
LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
LOGIN_REDIRECT_URL = 'base:home'
mysite.urls.py
from django.conf.urls import url, include
from django.contrib import admin
from mysite.views import home
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^base/', include('base.urls', namespace="base")),
url(r'^$', home.as_view(), name="login"),
url(r'^oauth/', include('social_django.urls', namespace='social')),
]
mysite.views.py
from django.views.generic import RedirectView
class home(RedirectView):
url = "/oauth/login/google-oauth2/"
social.py
from django.shortcuts import render_to_response
def customize_user_data(strategy, details, response, *args, **kwargs):
if kwargs['backend'].name == 'google-oauth2':
if details['first_name'] != "학부생":
return render_to_response('login_failed.html', {'error': "학부생이 아닙니다."})
elif response['domain'] != "handong.edu":
return render_to_response('login_failed.html', {'error': "handong.edu 아이디만 접속할 수 있습니다."})
return None
def create_user(strategy, details, user=None, *args, **kwargs):
if user:
return {'is_new': False}
fields = {'username': details.get('email'), 'name': details.get('last_name'), 'nickname': details.get('last_name'), 'student_id': details.get('username')}
if not fields:
return
return {
'is_new': True,
'user': strategy.create_user(**fields)
}