کار ها:
یک شرکت نرمافزاری میخواهد برای خود یک سیستم مدیریت پروژه بنویسد. بدین منظور سایتی با قابلیت های زیر طراحی شده است:
از این لینک میتوانید source code های پروژه را دانلود کنید.
ساختار این پروژه به شکل زیر است:
مدلِProjectMembership
که در فایل models.py نوشته شده است، عضویت یک فرد را در یک پروژه به همراه نقش او در پروژه نشان میدهد.
در فایل views.py نیز چندین view وجود دارد که اعمال مختلف قابل انجام روی پروژه را پیاده سازی کرده است.
این سایت بدین شکل کار میکند که همواره فقط یکی از پروژه های کاربر به عنوان "پروژه فعلی" او انتخاب شده است که از طریق صفحهی index
نیز قادر به مشاهده این پروژه هستیم و تمامی اعمال مختلف مانند حذف پروژه و غیره، روی همین پروژه فعلی انجام میشوند.
نکته: یک کاربر در یک پروژه فقط یک بار و با یک نقش میتواند عضو باشد. بنابراین واژه های "پروژهی فعلی" و "عضویت فعلی" به یک معنا هستند.
حال از شما میخواهیم تغییرات زیر را در این پروژه انجام دهید.
این view شناسهی یک پروژه را به عنوان ورودی گرفته و آن را به عنوان پروژه فعلی انتخاب میکند. بدین منظور یک field در مدل ProjectMembership به نام is_current در نظر گرفته شده است که باید آن را مقدار دهی کند(is_current=True
) و برای سایر عضویتها (ProjectMembership) نیز این field را False کند.
index
(یعنی آدرس /project
) redirect کند. در صفحهی index باید بتوانیم پروژه انتخاب شده را ببینیم.برای این بخش از سوال باید یک تابع به نام has_permission(action)
در مدل ProjectMembership
تعریف کنید. این تابع یک رشته را به عنوان ورودی دریافت میکند و بر اساس role
یک boolean بازمیگراند. انواع roleها در این مدل مشخص اند. شما باید بر اساس جدول زیر به ازای هر رشته ورودی خروجی درست را بازگردانید. توجه کنید که ورودی تابع به صورت snake_case میباشد.
جدول زیر دسترسی های نقش های مختلف در این پروژه را مشخص میکند.
Action | Guest | Reporter | Developer | Master | Owner |
---|---|---|---|---|---|
create_new_issue | ✓ | ✓ | ✓ | ✓ | ✓ |
leave_comments | ✓ | ✓ | ✓ | ✓ | ✓ |
pull_project_code | ✓ | ✓ | ✓ | ✓ | |
assign_issues_and_merge_requests | ✓ | ✓ | ✓ | ✓ | |
see_a_list_of_merge_requests | ✓ | ✓ | ✓ | ✓ | |
manage_merge_requests | ✓ | ✓ | ✓ | ||
create_new_branches | ✓ | ✓ | ✓ | ||
add_new_team_members | ✓ | ✓ | |||
push_to_protected_branches | ✓ | ✓ | |||
switch_visibility_level | ✓ | ||||
remove_project | ✓ | ||||
force_push_to_protected_branches | |
یک فایل به نام decorators.py
نوشته شده است. شما باید در این فایل یک decorator بنویسید. این decorator در بالای همهی view های موجود در فایل views.py
قرار داده شده است. این decoratorبه شکل @projects_panel()
در بالای view ها استفاده میشود که یک آرگومان optional به نام permissions
دریافت میکند. در صورتی که این آرگومان به decorator پاس داده شود باید به صورت یک لیست باشد. برای مثال:
در این decorator باید کار های زیر را به ترتیب انجام دهید:
۱. ابتدا باید چک کنید که آیا برای کابر مورد نظر پروژه ای وجود دارد یا خیر.
"No projects found"
بازگردانید.request.memberships
را برابر queryset
عضویت های کاربر قرار دهید.۲. سپس باید چک کنید که آیا یک پروژه به عنوان پروژه فعلی برای کاربر وجود دارد یا خیر.
request.current_membership
را برابر عضویت فعلی کاربر قرار دهید.۳. request.project
را برابر پروژه فعلی کاربر قرار دهید.
۴. اگر آرگومان permissions
وجود داشت باید بررسی کنید که آیا کاربر درعضویت فعلی خود، دسترسی های لازم را دارد یا خیر. برای این کار میتوانید از تابع has_permission
که در قسمت قبل نوشتید استفاده کنید.
models.py
میتوانید به تعداد دلخواه به هر مدلی تابع اضافه کنید. اما field ها و نام های مدل ها را تغییر ندهید.