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)
    #pw_answer = models.CharField(max_length=20)
    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)       # ImageField Form 주의 (enctype=multipart, filename/filedata multi bound, is_multipart) default값 설정
    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)
    }

results matching ""

    No results matching ""