مُجَزا


حامد و حمید برادر هستند.

از آن‌جایی که حمید، مُزْدَوَجْ است؛ عاشق اعداد زوج و از آن‌جایی که حامد مُنْفَرِد است؛ عاشق اعداد فرد است.

حال به این دو برادر، لیستی از اعداد صحیح داده می‌شود و از آن‌جایی که هر کدام از آن‌ها به یک نوع از اعداد زوج یا فرد علاقه‌مند است؛ تصمیم می‌گیرند که حمید، اعداد زوج و حامد نیز اعداد فرد را برای خود جدا کنند.

از آن‌جایی که این دو برادر درگیر کارهای بنیادین دیگری هستند، از شما می‌خواهند تا این کار را برای آن‌ها انجام دهید.

حال تابع separator را به‌گونه‌ای تکمیل کنید که با گرفتن لیستی از اعداد صحیح، تاپلی (tuple) از دو لیست به همان ترتیبی که در لیست ورودی آمده‌اند را بازگرداند که لیست اول شامل اعداد زوج و لیست دوم شامل اعداد فرد باشد.

extensionFromNameseparator.py
def separator(ls):
    pass
Python

نمونه ۱🔗

extensionFromNameterminal
>>> separator([-3, -2, -1, 0, 1, 2, 3])
([-2, 0, 2], [-3, -1, 1, 3])
Python

نمونه ۲🔗

extensionFromNameterminal
>>> separator([1, 11, 5, 7, 3])
([], [1, 11, 5, 7, 3])
Python

نکات🔗

  • می‌توانید فایل اولیه این سوال را از این لینک دریافت کنید.
  • شما باید تابع separator موجود در فایل separator.py را تکمیل و سپس این فایل را ارسال کنید.
  • تابع شما نباید مقداری را چاپ کند، بلکه باید مقادیر مورد نظر را بازگرداند.
  • لیست بازگردانده‌شده‌ی اول، باید حاوی اعداد زوج و لیست دوم حاوی اعداد فرد باشد.
  • اعداد داخل لیست‌ها، باید به همان ترتیبی که در لیست اولیه قرار داشته‌اند، قرار بگیرند.

تَخَطّی‌گَری


در این سؤال از شما می‌خواهیم که کد زیر را در یک خط پیاده‌سازی کنید.

طول کدی که شما ارسال می‌کنید باید دقیقا یک خط باشد و در آن نمی‌توانید از ; یا تابع exec استفاده کنید. حال ما از شما که خودتان را پایتون کار قهاری می‌دانید می‌خواهیم تا این سوال را حل کنید.

extensionFromNamecode.py
input_string = str(input())
array = []
for i in range(len(input_string)):
    if (ord(input_string[i]) - 97) % 2 == 0:
        array.append(input_string[i])
    else:
        array.append(input_string[i].upper())
array.sort(reverse=True)
answer = ' '.join(array)
print(answer)
Python
توضیحات کد

ابتدا ورودی که یک رشته است را دریافت کرده و یک لیست ایجاد می‌کنیم.

سپس روی رشته‌ی دریافتی پیمایش می‌زنیم و در هر مرحله اگر نتیجه که حاصل تفریق ۹۷ از کد ascii حرف موردنظر است، بر ۲ بخش‌پذیر بود، حرف مورد نظر را به لیست اضافه می‌کنیم؛ در غیر این‌صورت، آن حرف را به حرف بزرگ انگلیسی تبدیل کرده و سپس به لیست اضافه می‌کنیم.

پس از آن، اعضای لیست را به طور نزولی مرتب‌ می‌کنیم و در نهایت اعضای لیست را در قالب یک رشته چاپ می‌کنیم.

  • پیشنهاد می‌کنیم ابتدا یکبار کد فوق را اجرا کرده و آن را با ورودی‌های نمونه امتحان کنید و خروجی‌های مورد نظر را مشاهده کنید. سپس طبق اطلاعات بدست آمده، شروع به حل سؤال کنید.

ورودی🔗

در تنها خط ورودی، یک رشته‌ آمده است. 1input_string1001 \le |input\_string| \le 100

خروجی🔗

در تنها خط خروجی، حروف مورد نظر از رشته‌ی ورودی را که دارای شرایط گفته شده بودند را به ترتیب نزولی چاپ کنید. توجه کنید که بین هر دو حرف، باید یک فاصله وجود داشته باشد.

ورودی نمونه ۱🔗

saeid
Plain text

خروجی نمونه ۱🔗

s i e a D
Plain text

ورودی نمونه ۲🔗

alexander
Plain text

خروجی نمونه ۲🔗

e e a a X R N L D
Plain text

نکات🔗

  • می‌توانید فایل اولیه این سوال را از این لینک دریافت کنید.
  • شما باید فایل source.py را تکمیل و سپس این فایل را ارسال کنید.
  • تضمین می‌شود که رشته‌های ورودی، تنها از حروف کوچک انگلیسی تشکیل شده‌اند و شامل کاراکترهای Whitespace نیستند.
  • در صورتی از این سؤال نمره‌ای دریافت خواهید کرد که تمام شروط خواسته شده را به درستی پیاده‌سازی کنید و کدتان تمام تست‌ها را پاس کند. در صورتی که حتی یک تست را پاس نشوید، نمره‌ای از این تمرین دریافت نخواهید کرد.

زَنجیره


در این تمرین باید کلاسی به نام Chain طراحی کنید به طوری که رفتارهای زیر را داشته باشد:

جمع زنجیره‌ای اعداد🔗

وقتی یک یا چند عدد (چه صحیح چه اعشاری) به صورت زنجیروار به عنوان پارامتر به کلاس ارسال می‌شوند، خروجی باید یک عدد حاصل جمع اعداد ورودی باشد. همچنین خود اشیا باید با مقدار خروجی برابر باشند.

extensionFromNameterminal
>>> Chain(2.5)(2)(2)(2.5) # sum
9
>>> Chain(3)(1.5)(2)(3) # sum
9.5

>>> Chain(64) == 64
True
Python

الحاق زنجیره‌ای رشته‌ها🔗

وقتی یک یا چند رشته به صورت زنجیروار به عنوان پارامتر به کلاس ارسال می‌شوند، خروجی باید یک رشته حاصل الحاق رشته‌های ورودی با یک کاراکتر فاصله (به‌عنوان جدا کننده) باشد. همچنین خود اشیا باید با مقدار خروجی برابر باشند.

extensionFromNameterminal
>>> Chain('Ali')('Safinal')('is')('the')('best.') # concat with space
'Ali Safinal is the best.'

>>> Chain('abc')('defg') == 'abc defg'
True
Python

حالت‌های دیگر🔗

در دو حالت زیر باید یک Exception با پیغام invalid operation پرتاب شود:

  1. یک یا چند رشته و عدد، هم‌زمان به صورت زنجیروار به عنوان پارامتر به کلاس ارسال می‌شوند.
  2. هر پارامتری که از جنس رشته یا عدد نباشد به کلاس ارسال شود.
extensionFromNameterminal
>>> Chain('Ali')(5) # raising exception with the following message
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: invalid operation

>>> Chain(9)([1, 2]) # raising exception with the following message
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: invalid operation
Python

حال از شما خواسته شده تا کلاس Chain را تکمیل کنید.

extensionFromNamechain.py
class Chain:
    pass
Python

نکات🔗

  • می‌توانید فایل اولیه این سوال را از این لینک دریافت کنید.
  • شما باید کلاس Chain موجود در فایل chain.py را تکمیل و سپس این فایل را ارسال کنید.
  • در صورت تمایل، می‌توانید علاوه‌بر کلاس Chain، کلاس‌ها و تابع‌های کمکی دیگری نیز در فایل chain.py پیاده‌سازی کنید.

جَلال و جَلالی


جَلال انسانی وطن‌دوست و میهن‌پرست است.

او که از کار کردن با تقویم میلادی و تبدیل دائم آن به تقویم شمسی خسته شده بود، از شما برای رفع این مشکل درخواست کمک کرده است. از آن‌جایی که شما نیز انسانی وطن‌دوست و میهن‌پرست هستید، با کمال میل به کمک او می‌شتابید و به جَلال کمک می‌کنید تا با تقویم جَلالی کار کند.

در این پروژه شما باید قابلیت اضافه‌کردن تاریخ فارسی به مدل جنگو را با استفاده از کتابخانه‌ی django_jalali پیاده‌سازی کنید.

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

jalali
├── Users
│   ├──  > admin.py < 
│   ├── apps.py
│   ├──  > forms.py < 
│   ├── migrations
│   │   └── __init__.py
│   ├──  > models.py < 
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── jalali
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── Pipfile
├── Pipfile.lock
└── requirements.txt
Plain text

مدل CustomUser🔗

اپلیکیشن Users فقط شامل یک مدل به نام CustomUser است که این مدل شامل فیلدهای زیر می‌باشد:

ویژگی‌ها🔗

  • ویژگی ‍‍username : این فیلد از نوع CharField و حداکثر طول آن ۲۵۶ می‌باشد.
  • ویژگی ‍‍full_name : این فیلد از نوع CharField و حداکثر طول آن ۲۵۶ می‌باشد.
  • ویژگی ‏gender : این فیلد از نوع CharField می‌باشد. ویژگی gender باید از بین جنسیت‌های Male و Female انتخاب شود و در داخل پایگاه داده به جای Male حرف M ذخیره و به جای کلمه‌ی Female حرف F ذخیره شود.
  • ویژگی ‍‍national_code : این فیلد از نوع CharField و حداکثر طول آن ۱۰ می‌باشد.
  • ویژگی birthday_date : این فیلد از نوع تاریخ (‍date) شمسی می‌باشد.
  • ویژگی ‏ceremony_datetime : این فیلد از نوع تاریخ و ساعت (datetime) شمسی می‌باشد.
  • ویژگی country :‌ این فیلد از نوع CharField است و مقدار آن، برای همه‌ی شئ‌ها برابر رشته‌ی Iran است.

توابع🔗

  • تابع get_first_and_last_name : این تابع، first_name و last_name کاربر را از روی فیلد full_name بدست آورده و در قابل یک دیکشنری بازمی‌گرداند. تضمین می‌شود که فیلد full_name فقط شامل یک فاصله (آن هم بین first_name و last_name) می‌باشد.

    extensionFromNameterminal
    >>> valid_name = 'Mohammadreza Zamani'
    >>> wrong_name = 'Mohammad Reza Zamani'
    >>> wrong_name = 'Mohammad reza Zamani'
    Python

    دیکشنری بازگردانده‌شده از این تابع، باید به‌صورت زیر باشد:

    {'first_name': first_name, 'last_name': last_name}
    Python

    برای مثال، برای کاربری با full_name='Saeid Zamani'، خروجی تابع به‌صورت زیر خواهدبود:

    {'first_name': 'Saeid', 'last_name': 'Zamani'}
    Python
  • تابع get_age : این تابع، سن کاربر را از روی فیلد birthday_date محاسبه کرده و بازمی‌گرداند. دقت کنید که این تابع باید جزء صحیح سن را بازگرداند. مثلا اگر شخصی ۵ سال و ۳ ماه سن داشت، باید عدد ۵ را بازگرداند یا اگر شخصی ۱۰ سال و ۱۱ ماه داشت باید عدد ۱۰ را بازگرداند.

extensionFromNameterminal
>>> from Users.models import CustomUser
>>> b = CustomUser.objects.get(person_name='Sara')
>>> b.birthday_date
jdatetime.date(1377, 10, 8)
>>> b.get_age()
23
Python
  • تابع is_birthday : این تابع مشخص می‌کند که آیا امروز، روز تولد کاربر مورد نظر هست یا خیر. در صورتی که امروز، روز تولد کاربر بود، مقدار True و در غیر این‌صورت، مقدار ‌False را بازمی‌گرداند.

فرم CustomUserForm🔗

تمامی فیلدهای مدل CustomUser باید داخل کلاس CustomUserForm در فایل ‍‍forms.py وجود داشته باشند.

اعتبارسنجی‌ها:

  • فیلد national_code باید دقیقا شامل ۱۰ کاراکتر باشد.
  • فیلد full_name باید حتماً شامل first_name و last_name باشد و هر دوی این مقادیر باید عنوان باشند. عنوان‌ بودن یعنی با یک حرف بزرگ انگلیسی شروع شده و بقیه‌ی حروف هر کلمه کوچک باشند.
    >>> valid_name = 'Arash Ghasemi'
    >>> wrong_name = 'arash ghasemi'
    Python

ادمین🔗

مدل‌ CustomUser موجود در models.py باید در پنل ادمین ثبت شده و قابل مشاهده باشد.

شخصی‌سازی CustomUserAdmin🔗

  • در لیست CustomUserها، مقادیر زیر نمایش داده شود (ترتیب مهم نیست):
    • username
    • first_name
    • last_name
    • gender
    • national_code
    • birthday_date

توجه: فیلدهای first_name و last_name از روی فیلد full_name ایجاد می‌شوند.

  • قابلیت جستجو بر اساس username و full_name وجود داشته باشد.

  • لیست CustomUserها براساس ceremony_datetime، به صورت صعودی مرتب شده باشد.

نکات🔗

  • شما تنها مجوز ایجاد تغییرات در فایل‌های Users/models.py‍، Users/forms.py و Users/admin.py را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.
  • فراموش نکنید که می‌توانید با مطالعه‌ی testsample.py با روش تست کردن مدل‌ها، فرم‌ها و ادمین‌ها آشنا شوید.

نحوه ارسال🔗

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.

مهاجرت!


فرهاد که از این اوضاع نابسامان زندگی خسته شده است، تصمیم به مهاجرت می‌گیرد؛ ولی از آن‌جایی که به مقدار کافی، پول برای مهاجرت ندارد، تصمیم گرفت این مهاجرت را روی داده‌های پروژه‌ی خود پیاده‌سازی کند و آن‌ها را از شر این زندگی نجات دهد.

ولی از آن‌جایی که به افسردگی ناشی از عدم مهاجرت مبتلا شده، به کمک شما برای انجام این کار نیاز دارد.

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

migration
├── account
│   ├── admin.py
│   ├── apps.py
│   ├── fixtures
│   │   └── users.json
│   ├── forms.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── fixtures
│   │   └── articles.json
│   ├── __init__.py
│   ├──  > migrations < 
│   │   ├──  > 0001_initial.py < 
│   │   └── __init__.py
│   ├──  > models.py < 
│   ├── tests.py
│   └── views.py
├── config
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── Pipfile
├── Pipfile.lock
├── requirements.txt
└── tests
    ├── __init__.py
    └── testsample.py
Plain text

پایگاه‌داده🔗

اپلیکیشن blog فقط شامل یک مدل به نام Article است که این مدل شامل فیلدهای زیر می‌باشد:

  • ‍‍author : نام کاربری نویسنده‌ی مقاله
  • title : عنوان مقاله
  • ‏category : عنوان دسته‌بندی مقاله
  • ‏body : متن مقاله
  • ‏created : زمان ایجاد مقاله (این فیلد به طور خودکار در زمان ایجاد مقاله جدید مقداردهی می‌شود.)

ترمیم ساختار داده🔗

  • فیلد author باید به جای نام کاربری نویسنده به شئ User متناظر آن نویسنده اشاره کند (تضمین می‌شود مقدار فیلد برابر نام کاربری کاربر معتبر و موجود در پایگاه داده است.). همچنین در صورت حذف یک کاربر باید تمام مقالات نوشته‌شده توسط آن کاربر حذف شود.

  • فیلد category باید به شئ متناظر از مدل Category اشاره کند و در صورتی که آن شئ حذف شد باید برابر null قرار گیرد.

  • برای این کار باید مدل Category را پیاده‌سازی کنید. این مدل باید شامل فیلدهای زیر باشد:

    • title: عنوان دسته‌بندی (از نوع CharField و حداکثر طول ۵۰)
    • status: فعال بودن دسته بندی (از نوع BooleanField و مقدار پیش‌فرض True)

دقت کنید مقالات فعلی ممکن است دسته‌بندی‌های یکسانی داشته باشند. در نتیجه باید به شئ یکسانی از مدل Category اشاره کنند. همچنین فیلد category مقالات فعلی موجود در پایگاه داده بعد از اعمال مایگریشن باید برابر شئ از مدل Category شود که فیلد ‍title آن برابر مقدار فعلی فیلد category باشد (برای درک بهتر این دو جمله به عکس زیر دقت کنید.).

Migration

  • فیلد جدید ‍updated که از نوع DateTimeField است و بعد از هر بار تغییر شئ (فراخوانی تابع save) برابر زمان بروزرسانی می‌شود و برای مقالات فعلی برابر فیلد ‍‍created است.
  • فیلد جدید published که از نوع DateTimeField است و به صورت پیش‌فرض برابر زمان حال (timezone.now) است و برای مقالات فعلی برابر فیلد ‍‍created است.
  • فیلد جدید ‍status که از نوع CharField است و می‌تواند برابر دو مقدار p و d باشد و به صورت پیش‌فرض برابر d است و حتما باید مقدار داشته باشد. (‍p به معنای منتشر شده یا publish و d به معنای پیش‌نویس یا draft) و برای مقالات فعلی برابر p است.

نکات🔗

  • شما تنها مجوز ایجاد تغییرات در فایل‌های blog/models.py‍ و blog/migrations را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.
  • توجه کنید که نباید داخل فایل blog/migrations/0001_initial.py تغییری ایجاد کنید.
  • فراموش نکنید که می‌توانید با مطالعه‌ی testsample.py با روش تست کردن مدل‌ها و مایگریشن‌ها آشنا شوید.

نحوه ارسال🔗

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.

حسابداری سلیب


سلیب که تلاش‌های فراوانی برای رفتن به تیم فنی کوئرا کرده بود، در نهایت با مخالفت شدید مصطفی روبه‌رو شد.

او که از دار دنیا فقط دوستی با مازیار را داشت؛ به او متوسل شد تا به عضویت تیم مالی درآید ولی مازیار که در کار، آدم جدی‌ای است؛ به او ۱۰ تسک و مهلت ۱ ساعته (مشخصه نمی‌خواد استخدامش کنه!) داد تا در صورتی که این تسک‌ها را با موفقیت انجام داد، رزومه او را بررسی کند.

حال سلیب که هیچ‌گونه استعدادی در این کار ندارد،‌ دست به دامان شما شده است تا در این فرصت کم، با استفاده از ۱۰ کوئری، پاسخ‌ تسک‌ها را برای او بفرستید و او را در کسب شغل جدید همراهی کنید.

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:

Quera_Finance
├── Finance
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── fixtures
│   │   ├── auth_sample.json
│   │   └── data_sample.json
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├──  > queries.py < 
│   ├── tests.py
│   └── views.py
├── Quera
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── requirements.txt
└── tests
    ├── __init__.py
    └── testsample.py
Plain text

در فایل models.py هشت مدل به شرح زیر وجود دارد.

مدل Department (بخش‌های مختلف شرکت)
  • name: نام بخش
  • phone: شماره تلفن بخش
مدل Employee (کارمند)
  • account: اکانت کارمند که اطلاعات کاربری او را نگه می‌دارد.
  • department: بخشی که کارمند در آن کار می‌کند.
  • phone: شماره تلفن کارمند
مدل Project (پروژه)
  • title: عنوان پروژه
  • department: بخش مربوطه پروژه
  • employees: کارمندان حاضر در پروژه
  • estimated_end_time: زمان تخمین‌زده شده اتمام پروژه
  • end_time: زمان اتمام پروژه
مدل EmployeeProjectRelation (ذخیره اطلاعات اضافی برای حضور کارمندان در پروژه‌های مختلف)
  • employee: کارمند مربوطه
  • project: پروژه مربوطه
  • hours: ساعت‌های کاری در پروژه
  • role: نقش کارمند در پروژه
مدل Attendance (حضور و غیاب)
  • employee: کارمند مربوطه
  • date: تاریخ
  • in_time: زمان ورود به شرکت
  • out_time: زمان خروج از شرکت
  • late_cause: دلیل تأخیر (در صورت تاخیر)
مدل Salary (حقوق)
  • employee: کارمند مربوطه
  • base: حقوق پایه
  • tax: مالیات (درصد)
  • insurance: بیمه (درصد)
  • overtime: اضافه کار (ساعت)
مدل Payment (پرداخت)
  • amount: مقدار پرداخت‌شده
  • account_number: شماره حساب مقصد
  • payment_type: نوع پرداخت
  • description: توضیحات پرداخت
  • date: تاریخ پرداخت
مدل Payslip (فیش حقوقی)
  • base: پایه حقوق
  • tax: مالیات (تومان)
  • insurance: بیمه (تومان)
  • overtime: اضافه کار (تومان)
  • salary: حقوق مربوطه
  • payment: پرداخت مربوطه

حال از شما می‌خواهیم پرس‌‌ و‌ جو (query) های زیر را روی مدل‌های بالا بنویسید.

حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!

۱. مجموع بدهی‌های شرکت برای حقوق کارمندان
  • حقوق‌های بدون پرداخت (base + tax + insurance + overtime) را در قالب یک dict به صورت زیر برگردانید.
{"total_dept": value }
Plain text
۲. مجموع حقوقِ اضافه کار کارمندانی که بیش‌تر مساوی hours=x ساعت روی پروژه‌هایشان اضافه کار کرده‌اند.
  • مجموع حقوق پرداختی اضافه کار (به تومان) به افرادی از شرکت که بیش‌تر مساوی x ساعت اضافه کاری داشته‌اند را در قالب یک dict به صورت زیر برگردانید.
{"total_overtime": value }
Plain text
۳. مجموع پرداخت‌های شرکت
  • مجموع پرداخت‌های شرکت را در قالب یک dict به صورت زیر برگردانید.
{"total": value }
Plain text
۴. مجموع ساعاتی که یک کارمند با id=x روی پروژه‌هایش کار کرده‌است.
  • مجموع ساعاتی که یک کارمند با id=x روی پروژه‌هایش کار کرده‌است را در قالب یک dict به صورت زیر برگردانید.
  • در صورتی که کارمند در پروژه‌ای شرکت نداشت، مقدار total_hours برابر None باشد.
{"total_hours": value }
Plain text
۵. لیست کارمندانی که مجموع حقوق دریافتی آن‌ها (پرداخت‌شده) بیش از یک مقدار x باشد.
  • ترتیب این لیست اهمیت ندارد.
۶. کارمندی که بیشترین ساعت پروژه انجام شده را دارد.
  • شئ کارمند را به همراه یک ستون اضافه به نام total_hours برگردانید.
  • اگر چند کارمند با مجموع ساعات برابر موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
۷. بخشی که بیشترین حقوق پرداخت‌شده تا کنون را دارد.
  • شئ بخش را همراه با یک ستون اضافه به نام total برگردانید.
  • اگر چند بخش با مجموع حقوق‌های پرداخت‌شده برابر موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
۸. بخشی که بیشترین تعداد پروژه را زودتر یا برابر موعد پیش‌بینی‌ شده تحویل داده است.
  • اگر چند بخش موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
۹. کارمندی که کمترین تعداد روزهای ورود با تاخیر را داشته باشد.
  • زمان ورود مجاز به عنوان آرگومان x داده می شود.
  • اگر چند کارمند موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
۱۰. تعداد کارمندانی که تا به حال در هیچ پروژه‌ای شرکت نکرده‌اند.
  • تعداد کارمندانی که تا به‌ حال در هیچ پروژه‌ای شرکت نکرده‌اند را در قالب یک dict به صورت زیر برگردانید.
{"total": value }
Plain text

زیرمسئله‌ها🔗

امتیاز بخش
۲۰ query_1
۲۰ query_2
۳۵ query_3
۳۵ query_4
۳۵ query_5
۴۵ query_6
۴۵ query_7
۴۵ query_8
۶۰ query_9
۶۰ query_10

امکانات اضافه🔗

در صورتی که علاقمندید که خودتان به صورت دستی کوئری‌های خود را امتحان کنید و از درستی آن‌ها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایل‌های مایگریشن‌ها ساخته شده‌اند و شما کافیست جهت ایجاد پایگاه‌داده، یک بار دستور migrate را اجرا کنید.

علاوه‌بر این، یک سری داده‌ی از پیش آماده شده، فراهم شده که بعد از اجرای دستور migrate، می‌توانید آن‌ها را وارد پایگاه‌داده‌ی پروژه‌ی خود کنید. به این منظور، دستور زیر را اجرا کنید. می‌توانید از این داده‌ها به جهت تست کردن کوئری‌های خود استفاده کنید.

۱. ایجاد پایگاه‌داده

extensionFromNameterminal
python manage.py migrate
Shell

۲. وارد کردن داده‌های از پیش آماده شده (fixture)

extensionFromNameterminal
python manage.py loaddata Finance/fixtures/auth_sample.json
python manage.py loaddata Finance/fixtures/data_sample.json
Shell

در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاه‌داده و وارد کردن داده‌های آزمایشی نیست، و تنها کافیست که در فایل queries.py کوئری‌های خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئری‌هایتان استفاده کنید.

نکات🔗

  • یک فایل به نام queries.py وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد‌های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.
  • برای نمونه تابع query_0 در پاسخ به پرس و جویِ «لیست همه ی کارمندان» کامل شده است که شما نیز باید مشابه همین تابع، بقیه توابع را تکمیل کنید.
extensionFromNamequeries.py
def query_0():
    q = Employee.objects.all()
    return q
Python
  • در سوالاتی که در صورت سوال، مقداری به صورت متغیر ذکر شده است؛ متغیر مورد نظر در آرگومان‌های ورودی تابع در نظر گرفته شده است. شما نباید آرگومان‌های ورودی تابع را تغییر دهید.

  • در تمام سوالات به جز سوالاتی که خروجی نمونه برای آنها مشخص شده است، همان‌طور که ذکر شد، خروجی شما یک شئ از نوع QuerySet با اِلِمان‌هایی از جنس گفته‌شده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.

  • شما تنها مجوز ایجاد تغییرات در فایل‌ Finance/queries.py را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.

  • فراموش نکنید که می‌توانید با مطالعه‌ی testsample.py با روش تست کردن کوئری‌ها آشنا شوید.

نحوه ارسال🔗

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.