# Path: apps/ksso/models.py
# class PortalInfo(models.Model):
#     """
#     사용자의 포탈 계정 정보를 저장하는 모델.
#     """
# 
#     user = models.OneToOneField(
#         'auth.User',
#         primary_key=True, related_name='portal_info',
#         verbose_name=_("유저 인스턴스"))
# 
#     kaist_uid = models.CharField(
#         _("KAIST UID"),
#         max_length=128, unique=True)
# 
#     ku_kname = models.CharField(
#         _("이름"),
#         max_length=128, blank=True)
# 
#     ku_acad_prog = models.CharField(
#         _("과정"),
#         max_length=32, blank=True)
# 
#     ku_std_no = models.CharField(
#         _("학번"),
#         max_length=32, blank=True)
# 
#     ku_psft_user_status_kor = models.CharField(
#         _("학적상태"),
#         max_length=32, blank=True)
# 
#     ku_born_date = models.CharField(
#         _("생년월일"),
#         max_length=32, blank=True)
# 
#     ku_sex = models.CharField(
#         _("성별"),
#         max_length=32, blank=True)
# 
#     ou = models.CharField(
#         _("학과"),
#         max_length=32, blank=True)
# 
#     mail = models.CharField(
#         _("메일주소"),
#         max_length=32, blank=True)
# 
#     mobile = models.CharField(
#         _("전화번호"),
#         max_length=32, blank=True)
# 
#     is_signed_up = models.BooleanField(
#         _("정보제공 동의여부"),
#         default=False,
#         help_text=_(
#             "정보제공에 반대하면 계정삭제 처리가 되나, 아직 동의여부를 "
#             "선택하지 않은 최초가입자의 경우 의사표현 시까지 정보가 "
#             "임시저장됩니다. 이 특수경우에는 정보를 활용하지 않아야 합니다."))
# 
#     #: 정보제공 동의한 사용자만 다루는 커스텀 매니저.
#     objects = PortalInfoManager()
# 
#     #: 모든 사용자를 다루는 기존 매니저.
#     all_objects = models.Manager()
# 
#     def __str__(self):
#         return self.ku_kname
# 
#     @classmethod
#     def create(cls, user, kaist_uid):
#         """
#         클래스 인스턴스 생성 메서드.
# 
#         사용자 인스턴스와 사용자 UID를 입력받습니다.
#         """
#         return cls(user=user, kaist_uid=kaist_uid)
# 
#     @property
#     def enter_year(self):
#         if self.ku_std_no and len(self.ku_std_no) == 8:
#             return self.ku_std_no[2:4]
#         return None


from django import forms
from django.contrib import admin
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
from .models import PortalInfo
"""
KAIST 단일인증서비스 어드민 페이지 설정.

Django 내장 인증 체계의 어드민 페이지와 병합하여 단일한 인증 시스템 관리로
구현합니다.
"""




def portal_info_protection(func):
    """
    사용자 리스트에서 정보제공 미동의 유저의 포탈 계정정보를 출력하지 않도록
    처리하는 데코레이터.
    """

    def decorator(self, e):
        if not e.portal_info.is_signed_up:
            raise ObjectDoesNotExist
        return func(self, e)
    return decorator


class PortalInfoInline(admin.StackedInline):
    """
    사용자 인스턴스 수정 시 포탈 계정정보 출력을 위한 인라인.
    """


# Path: apps/ksso/models.py
# class PortalInfo(models.Model):
#     """
#     사용자의 포탈 계정 정보를 저장하는 모델.
#     """
# 
#     user = models.OneToOneField(
#         'auth.User',
#         primary_key=True, related_name='portal_info',
#         verbose_name=_("유저 인스턴스"))
# 
#     kaist_uid = models.CharField(
#         _("KAIST UID"),
#         max_length=128, unique=True)
# 
#     ku_kname = models.CharField(
#         _("이름"),
#         max_length=128, blank=True)
# 
#     ku_acad_prog = models.CharField(
#         _("과정"),
#         max_length=32, blank=True)
# 
#     ku_std_no = models.CharField(
#         _("학번"),
#         max_length=32, blank=True)
# 
#     ku_psft_user_status_kor = models.CharField(
#         _("학적상태"),
#         max_length=32, blank=True)
# 
#     ku_born_date = models.CharField(
#         _("생년월일"),
#         max_length=32, blank=True)
# 
#     ku_sex = models.CharField(
#         _("성별"),
#         max_length=32, blank=True)
# 
#     ou = models.CharField(
#         _("학과"),
#         max_length=32, blank=True)
# 
#     mail = models.CharField(
#         _("메일주소"),
#         max_length=32, blank=True)
# 
#     mobile = models.CharField(
#         _("전화번호"),
#         max_length=32, blank=True)
# 
#     is_signed_up = models.BooleanField(
#         _("정보제공 동의여부"),
#         default=False,
#         help_text=_(
#             "정보제공에 반대하면 계정삭제 처리가 되나, 아직 동의여부를 "
#             "선택하지 않은 최초가입자의 경우 의사표현 시까지 정보가 "
#             "임시저장됩니다. 이 특수경우에는 정보를 활용하지 않아야 합니다."))
# 
#     #: 정보제공 동의한 사용자만 다루는 커스텀 매니저.
#     objects = PortalInfoManager()
# 
#     #: 모든 사용자를 다루는 기존 매니저.
#     all_objects = models.Manager()
# 
#     def __str__(self):
#         return self.ku_kname
# 
#     @classmethod
#     def create(cls, user, kaist_uid):
#         """
#         클래스 인스턴스 생성 메서드.
# 
#         사용자 인스턴스와 사용자 UID를 입력받습니다.
#         """
#         return cls(user=user, kaist_uid=kaist_uid)
# 
#     @property
#     def enter_year(self):
#         if self.ku_std_no and len(self.ku_std_no) == 8:
#             return self.ku_std_no[2:4]
#         return None


# Path: apps/ksso/admin.py
from django import forms
from django.contrib import admin
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
from .models import PortalInfo

"""
KAIST 단일인증서비스 어드민 페이지 설정.

Django 내장 인증 체계의 어드민 페이지와 병합하여 단일한 인증 시스템 관리로
구현합니다.
"""




def portal_info_protection(func):
    """
    사용자 리스트에서 정보제공 미동의 유저의 포탈 계정정보를 출력하지 않도록
    처리하는 데코레이터.
    """

    def decorator(self, e):
        if not e.portal_info.is_signed_up:
            raise ObjectDoesNotExist
        return func(self, e)
    return decorator


class PortalInfoInline(admin.StackedInline):
    """
    사용자 인스턴스 수정 시 포탈 계정정보 출력을 위한 인라인.
    """


    model = PortalInfo